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

委托与事件——委托

时间:2015-05-11 23:53:50      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

  C#中的委托与事件是很重要的概念,要学好C#,必须冲破这一关。

1.委托  

  关键字delegate,委托,它与类、枚举、结构、接口一样,也是一种类型

  由于委托是代表了一类具有相同参数列表和返回值的函数委托定义的变量用于保存具有相同签名的函数实体,它可以指代任何函数。所以,我们说类是对象的抽象,那么委托就可以看成是函数的抽象

  委托的好处:

    1.将方法动态地赋给参数,可以避免在程序中大量使用if-else(switch-case)语句,使程序具有良好的可扩展性。

 

    2.可以把函数本身的处理逻辑抽象出来,由调用者决定最终使用什么样的逻辑去处理。

 

  委托的用法,请看下面的代码

 1         //委托与类、枚举、结构、接口一样,也是一种类型
 2         //一个委托代表了具有相同参数列表和返回值的所有函数
 3         delegate int GetCalculatedValueDelegate(int x, int y);
 4         delegate void GreetingPeople();
 5 
 6         static int AddValue(int x,int y) 
 7         {
 8             return x + y;
 9         }
10 
11         static int SubValue(int x, int y)
12         {
13             return x - y;
14         }
15 
16         static int MulValue(int x, int y)
17         {
18             return x * y;
19         }
20 
21         static void EnglishGreating() 
22         {
23             Console.WriteLine("Hello");
24         }
25 
26         static void ChineseGreeting() 
27         {
28             Console.WriteLine("你好");
29         }
30 
31         //委托作为函数的参数来使用
32         //一个委托实体可以指代任何函数
33         static int CalculateValue(GetCalculatedValueDelegate fun,int x,int y)
34         {
35             return fun(x, y);
36         }
37 
38         static void Main(string[] args)
39         {
40             Console.WriteLine("委托作为参数来使用");
41             Console.WriteLine(CalculateValue(SubValue, 50, 20));
42 
43             Console.WriteLine("委托使用 += 和 -=");
44             GetCalculatedValueDelegate de = new GetCalculatedValueDelegate(AddValue);
45             de += SubValue;
46             de -= AddValue;//取消对AddValue方法的绑定
47             Console.WriteLine(de(20, 20));
48 
49             Console.WriteLine("给一个委托绑定多个方法");
50             GetCalculatedValueDelegate d = AddValue;//给委托赋值
51             d += SubValue; //给委托再绑定一个函数
52             d += MulValue; //给委托再绑定一个函数
53             Console.WriteLine(d(100, 30));
54 
55             GreetingPeople greeting = null;
56             greeting += EnglishGreating;
57             greeting += ChineseGreeting;
58             greeting();
59         }

 

 

运行结果:技术分享

  因为委托也是一种类型,所以我们可以进行操作的运算符主要有 = (赋值操作) += (把一个方法绑定到一个委托变量上)-=(取消绑定)。 要注意的是:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。所以上面的程序中,我们给委托d绑定了3个有返回值的方法,但最终返回的是MulValue的返回值;我们给委托greeting绑定了2个方法,最终我们看到了这两个方法的执行结果。

  关于委托的+=和-=的工作原理,请查看http://www.jb51.net/article/59449.htm

  委托的缺点:在上面的程序中,我们可以随意地给委托进行赋值,破坏了程序的封装性,所以接下来该事件出场了。

  接下来请看:委托与事件——事件。

 

委托与事件——委托

标签:

原文地址:http://www.cnblogs.com/lcxBlog/p/4495894.html

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