委托和事件在 .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语句,同时使得程序既有更好的扩展性。
多播委托,请听下回分解