委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事 件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
 
P1:什么是委托?事件是委托吗?
答:委托可以把一个方法当作一个参数带入另一个方法。
       也可以简单地理解为一个指向函数的引用。
       是,一种特殊的委托。
 
2、委托的实际应用有哪些?

我举两个实例。

1,[3a]不同语言的问候。

2,[3b]中文版QQ和Tencent QQ(国际版QQ)用户个人信息的”性别“呈现。

3、两个委托(Delegate)实例解析。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; /// <summary>
/// 语言类
/// </summary>
namespace Gyg.DE.Models
{
public class Language
{
/// <summary>
/// 声明一个委托
/// </summary>
/// <param name="name"></param>
public delegate string GrateingDelegate(string name); /// <summary>
/// 中式问候
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static string EngGrateing(string name)
{
return "英文名字=" + name;
} /// <summary>
/// 英式问候
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static string ChinaGreateing(string name)
{
return "中文名字=" + name;
} public static string GreatePerpon(string name, GrateingDelegate gratePerpon)
{
return gratePerpon(name);
}
}
}

案例2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Gyg.DE.Models
{
public class Sex
{
public delegate string SexDalegate(string sexCode); public static string ChinaSex(string sexCode)
{
switch (sexCode)
{
case "":
return "男";
case "":
return "女";
default:
return "未知";
}
} public static string EngSex(string sexCode)
{
switch (sexCode)
{
case "":
return "girl";
case "":
return "boy";
default:
return "Unknown";
}
} public static string SexConvert(string sexCode, SexDalegate sexConvert)
{
return sexConvert(sexCode);
}
}
}

控制器代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using Gyg.DE.Models; namespace Gyg.DE.Controllers
{
public class PerponController : Controller
{
// GET: Perpon
public ActionResult Index()
{
string name = Language.GreatePerpon("顾牡丹", Language.ChinaGreateing);
string nameEng = Language.GreatePerpon("gyg", Language.EngGrateing); ViewData["name"] = name;
ViewData["nameEng"] = nameEng; return View();
} public ActionResult SexTest()
{
ViewData["ChinaSex"] = Sex.SexConvert("", Sex.ChinaSex);
ViewData["EngSex"] = Sex.SexConvert("", Sex.EngSex);
return View();
}
}
}

页面代码:

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@ViewData["name"] <br />
@ViewData["nameEng"] <br />
<a href="/Perpon/SexTest">SexTest</a>
</div>
</body>
</html>
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>SexTest</title>
</head>
<body>
<div>
@ViewData["ChinaSex"] <br />
@ViewData["EngSex"] <br /> <a href="/Perpon/Index">Index</a>
</div>
</body>
</html>

4、使用委托(Delegate)有哪些好处?

我们现在对委托做一个总结:

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

.Net: C#中的委托(Delegate)和事件(Event)的更多相关文章

  1. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  2. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  3. 关于C# 委托(delegate)与事件(event)的用法及事例

    C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...

  4. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

  5. C#中的委托 Delegate(委托 也叫代表,代表一类方法)

    1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172 ...

  6. C#中的委托和事件(一)——delegate

    前言 来说一说委托(delegate)和事件(event),本篇采取的形式是翻译微软Delegate的docs中的重要部分(不要问我为什么微软的docs有中文还要读英文,因为读中文感觉自己有阅读障碍- ...

  7. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  8. c#中的delegate(委托)和event(事件)

    c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...

  9. 终于会用c#中的delegate(委托)和event(事件)了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...

随机推荐

  1. JAVASE(十五) 泛型 :泛型用例、自定义泛型类、通配符

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.泛型在集合中的使用 1.1 在集合中使用泛型之前的例子 ​ 为什么要有泛型(Generic)? 1. ...

  2. Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节

    计算机存储中有多少字节 题目 问题描述 在计算机存储中,12.5MB是多少字节? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余 ...

  3. Java实现第八届蓝桥杯图形排版

    标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...

  4. Java实现 蓝桥杯 算法提高 双十一抢购

    试题 算法提高 双十一抢购 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 一年一度的双十一又来了,某网购网站又开始了半价销售的活动. 小G打算在今年的双十一里尽情地购物,以享受购买 ...

  5. Java实现第九届蓝桥杯方格计数

    方格计数 题目描述 如图p1.png所示,在二维平面上有无数个1x1的小方格. 我们以某个小方格的一个顶点为圆心画一个半径为1000的圆. 你能计算出这个圆里有多少个完整的小方格吗? 注意:需要提交的 ...

  6. java实现第五届蓝桥杯年龄巧合

    年龄巧合 小明和他的表弟一起去看电影,有人问他们的年龄.小明说:今年是我们的幸运年啊.我出生年份的四位数字加起来刚好是我的年龄.表弟的也是如此.已知今年是2014年,并且,小明说的年龄指的是周岁. 请 ...

  7. java实现第五届蓝桥杯绳圈

    绳圈 题目描述 今有 100 根绳子,当然会有 200 个绳头. 如果任意取绳头两两配对,把所有绳头都打结连接起来.最后会形成若干个绳圈(不考虑是否套在一起). 我们的问题是:请计算最后将形成多少个绳 ...

  8. Python 图像处理 OpenCV (7):图像平滑(滤波)处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. 简述hadoop安装步骤

    简述hadoop安装步骤 安装步骤: 1.安装虚拟机系统,并进行准备工作(可安装- 一个然后克隆) 2.修改各个虚拟机的hostname和host 3.创建用户组和用户 4.配置虚拟机网络,使虚拟机系 ...

  10. ES 复合查询

    ES在查询过程中比较多遇到符合查询,既需要多个字段过滤也需要特殊情况处理,本文简单介绍几种查询组合方便快捷查询ES. bool布尔查询有一个或者多个布尔子句组成     filter 只过滤符合条件的 ...