委托,深入浅出才是王道

[来源] 达内    [编辑] 达内   [时间]2012-09-14

委托和事件在 .NET Framework 中的应用非常广泛,较好的理解委托和事件对很多人来说可能并不容易

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

View Code

以上代码定义一个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语句,同时使得程序既有更好的扩展性。

多播委托,请听下回分解

资源下载