委托是.net中非常重要的特性,自.net 1.x版本就包含了,委托在项目开发过程中应用得非常多,但是一直以来很多同学对其理解得不是非常清楚(也包括我,虽然做开发很多年了,可能很多地方不知不觉也使用到了委托,但是仍然不是很清楚),那么我会整理一个系列文章来总结和加深一下对委托的印象。
什么是委托
可以用两点概括:
1,最通俗的理解是,一个安全的'函数指针'。
2,本质上,委托是一个类(class)(可以通过IL证明如下图),并且委托包含的是具有相同方法签名相同返回值的多个方法。

委托的类图:

从上图我们可以得到几点信息,1,委托是一个类(class)。2,委托继承自System.MulticastDelegate类型。
为什么要使用委托
更通俗的说法是,使用委托能够带来什么好处。
下面通过一个小的例子来演示一下使用委托的好处。需求是,通过输入的name,控制台分别打印中文和英文的问候语。
不使用委托:
1 namespace DelegateDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //通过输入的name,控制台分别打印中文和英文的问候语 8 Hello("麦子", Language.Chinese); 9 Hello("mcgrady", Language.English);10 11 Console.ReadKey();12 }13 14 /// <summary>15 /// 问候16 /// </summary>17 /// <param name="name"></param>18 /// <param name="lang"></param>19 private static void Hello(string name, Language lang)20 {21 if (lang == Language.Chinese)22 {23 ChineseHello(name);24 }25 if (lang == Language.English)26 {27 EnglishHello(name);28 }29 }30 31 /// <summary>32 /// 中文问候33 /// </summary>34 /// <param name="name"></param>35 private static void ChineseHello(string name)36 {37 Console.WriteLine(string.Format("你好,{0}", name));38 }39 40 /// <summary>41 /// 英文问候42 /// </summary>43 /// <param name="name"></param>44 private static void EnglishHello(string name)45 {46 Console.WriteLine(string.Format("hello,{0}", name));47 }48 49 }50 51 /// <summary>52 /// 语言类型53 /// </summary>54 public enum Language55 {56 English,57 Chinese58 }59 }
不使用委托的时候,需要使用一个枚举Language来表示使用中文问候还是英文问候,并且还要进行if...else...的判断。
当可以直接传递方法的时候也许就简单多了,下面来看一下。
使用委托:
1 namespace DelegateDemo 2 { 3 //声明委托 4 delegate void MyDel(string name); 5 6 class Program 7 { 8 static void Main(string[] args) 9 {10 //通过输入的name,控制台分别打印中文和英文的问候语11 Hello("麦子", ChineseHello);12 Hello("mcgrady", EnglishHello);13 14 Console.ReadKey();15 }16 17 /// <summary>18 /// 问候19 /// </summary>20 /// <param name="name"></param>21 /// <param name="myDel"></param>22 private static void Hello(string name, MyDel myDel)23 {24 myDel(name);25 }26 27 /// <summary>28 /// 中文问候29 /// </summary>30 /// <param name="name"></param>31 private static void ChineseHello(string name)32 {33 Console.WriteLine(string.Format("你好,{0}", name));34 }35 36 /// <summary>37 /// 英文问候38 /// </summary>39 /// <param name="name"></param>40 private static void EnglishHello(string name)41 {42 Console.WriteLine(string.Format("hello,{0}", name));43 }44 45 }46 }
所以总结起来,委托带来的好处主要有以下几点:
1,省去了大量的 if...else...或switch... 的判断,使得程序更面向对象了。
2,解耦,程序更容易扩展。例子:Tracy.Proxy接口代理组件,记录xml日志和性能日志。
当然,这只是一个例子,目的是说明使用委托带来的好处,其实还有很多地方都使用到了委托,比如winform和webform的按钮click事件,Linq中的Func和Action委托等。
委托的应用场景
1,winform和webform的按钮click事件。
2,Linq中的Func和Action委托。
3,Tracy.Proxy接口代理组件
用XMind来总结一下:

编辑推荐:
- 什么是委托?总结.net中重要的特性委托02-21
- 对wcf的理解--实现计算器功能02-21
- C# 多线程--线程池的详细介绍02-21
- .NET Core 和 .NET .Framework 相比哪个速度快?02-21
- C#中SQL参数传入空值出错误和如何解决办法02-21
- szq.orm.sql02-21
- jquery pqgrid分页控件乱码是什么情况?02-21
- Win10应该改进的10个方面是否应把免费放首位02-21
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 什么是委托?总结.net中重要的特性委托
什么是委托?总结.net中重要的特性委托
26-02-21 - 对wcf的理解--实现计算器功能
对wcf的理解--实现计算器功能
26-02-21 - C# 多线程--线程池的详细介绍
C# 多线程--线程池的详细介绍
26-02-21 - .NET Core 和 .NET .Framework 相比哪个速度快?
.NET Core 和 .NET .Framework 相比哪个速度快?
26-02-21 - jquery pqgrid分页控件乱码是什么情况?
jquery pqgrid分页控件乱码是什么情况?
26-02-21 - Win10应该改进的10个方面是否应把免费放首位
Win10应该改进的10个方面是否应把免费放首位
26-02-21 - Win10的没用的应用软件怎么办?不喜欢可以完全卸
Win10的没用的应用软件怎么办?不喜欢可以完全卸
26-02-21 - Win10系统邮件和日历同步错误0x80c8043e的解决办法
Win10系统邮件和日历同步错误0x80c8043e的解决办法
26-02-21 - 属性值反序列化失败怎么解决?
属性值反序列化失败怎么解决?
26-02-21 - 让WebAPI 返回JSON格式的数据实例教程
让WebAPI 返回JSON格式的数据实例教程
26-02-21
