委托与事件——委托

  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

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

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

 

转载于:https://www.cnblogs.com/lcxBlog/p/4495894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值