码迷,mamicode.com
首页 > 其他好文 > 详细

委托(1)认识委托

时间:2017-06-08 18:10:22      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:并且   read   信息   param   private   印象   str   好处   info   

  委托是.net中非常重要的特性,自.net 1.x版本就包含了,委托在项目开发过程中应用得非常多,但是一直以来很多同学对其理解得不是非常清楚(也包括我,虽然做开发很多年了,可能很多地方不知不觉也使用到了委托,但是仍然不是很清楚),那么我会整理一个系列文章来总结和加深一下对委托的印象。

什么是委托

可以用两点概括:

1,委托是一个类(class),可以通过查看IL代码证明。如下图。

2,委托包含的是具有相同签名,相同返回值类型的多个方法(也可以只有一个)。

技术分享

从上图我们可以得到几点信息,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 Language
55     {
56         English,
57         Chinese
58     }
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...的判断。

2,程序更面向对象了,也更具有扩展性了。后面如果再有日语,德语版本,直接传入德语的name和德语的Hello方法就可以了。 

当然,这只是一个例子,目的是说明使用委托带来的好处,其实还有很多地方都使用到了委托,比如winform和webform的按钮click事件,Linq中的Func和Action委托等。

 

委托的应用场景

1,winform和webform的按钮click事件。

2,Linq中的Func和Action委托。

 

用XMind来总结一下:

技术分享

 

委托(1)认识委托

标签:并且   read   信息   param   private   印象   str   好处   info   

原文地址:http://www.cnblogs.com/mcgrady/p/6963530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!