委托,深入浅出才是王道

  委托和事件在 .NET Framework 中的应用非常广泛,较好的理解委托和事件对很多人来说可能并不容易。它们像一道坎儿,过了这个坎儿的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里模糊,浑身不自在。下面就通过简洁的语言和通俗的例子来讲一下什么是委托、如何实现委托,如何实现委托,以及事件的使用与处理。

View Code
复制代码
 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         PepoleClass pc=new PepoleClass();
 6         pc.SpeakOperate(@"张三",PepoleClass.Language.ch);
 7         pc.SpeakOperate(@"张三",PepoleClass.Language.en);
 8         Console.ReadLine();
 9     }
10 }
11 public class PepoleClass
12 {
13     public void SpeakChinese(string name)
14     {
15         Console.WriteLine("你好,{0}", name);
16     }
17 
18     public void SpeakEnglish(string name)
19     {
20         Console.WriteLine("Hello,{0}", name);
21     }
22 
23     public enum Language
24     {
25         en, ch
26     }
27 
28     public void SpeakOperate(string name, Language lang)
29     {
30         switch (lang)
31         {
32             case Language.ch:
33                 SpeakChinese(name);
34                 break;
35             case Language.en:
36                 SpeakEnglish(name);
37                 break;
38         }
39     }
40 }
复制代码

以上代码定义一个pepole类,实现讲中文和英语的方法,通过枚举类型控制说那种语言,这样是很好。但是细想一下,这个方法的扩展性还是太差了,如果以后我们需要再添加法语、德语,就不得不反复修改枚举和SpeakOperate()方法以适应新的需求。

那么,有没有更好的解决方案呢?

可能你已经想到了,我们可以使用委托。

引入委托

我们先来看看SpeakOperate()方法的声明:

public void SpeakOperate(string name, Language lang)

可以看到,我们需要传入两个参数,然后根据枚举类型判断用哪个方法进行处理。我们假设SpeakOperate()方法可以接收一个参数变量,这个参数变量可以代表一个方法,我们只需要传入方法名然后执行相应方法,对了,这就是委托!

      在C#中,定义委托的语法是:

delegate void SpeakDelegate(string name);

delegate关键字用于声明一个引用类型,该类型可用于封装命名方法和匿名方法。

下面用委托来改造一下这个demo,只需定义一个委托,然后更改SpeakOperate()方法即可:

public delegate void SpeakDelegate(string name);
public void SpeakOperate(string name, SpeakDelegate speak_method)
{
    speak_method(name);
}

Main函数中的调用如下:

复制代码
static void Main(string[] args)
{
    PepoleClass pc = new PepoleClass();
    pc.SpeakOperate(@"张三", pc.SpeakChinese);
    pc.SpeakOperate(@"张三", pc.SpeakEnglish);
    Console.ReadLine();
}
复制代码
总结:

委托是一种特殊的对象类型,它定义了方法的类型,是的可以将方法当作另一个方法的参数来进行传递,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是方法的地址。这种方法动态地赋值给参数的做法,可以避免在程序中大量使用if…else、switch语句,同时使得程序既有更好的扩展性。

多播委托,请听下回分解

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值