1.定义
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数为返回值。简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。
2.使用
使用委托的四部曲:
- 定义一种委托类型
- 委托执行时要调用方法
- 定义一个委托实例
- 委托实例的调用
我们可以这样子认为:委托是一个类,它定义了方法的类型,使得可以将方法当作别一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
3.自定义委托
前面的话有点难理解,接下来我们通过具体的例子分析一下何谓委托,该如何实现委托。现在不是很喜欢搞多国语言化的吗?看看如何让我们的程序会说多种语言吧。
1 /// <summary> 2 /// the English speaker. 3 /// </summary> 4 /// <param name="name">The name.</param> 5 public void EnglishSpeaker(string name) 6 { 7 Console.WriteLine( 8 string.Format("Hello my name is {0} and I am English speaker.\n", name)); 9 } 10 /// <summary> 11 /// the Chineses speaker. 12 /// </summary> 13 public void ChineseSpeaker(string name) 14 { 15 Console.WriteLine( 16 string.Format("您好我的名字叫{0},我是讲普通话的。\n", name)); 17 }
好啦现在我们有两个方法分别是说普通话和英语,现在我们的程序会说普通话和英语啦。现在我们考虑究竟什么时候讲普通话什么时候讲英语,那不简单我们加个判断就OK啦,是的我们可以通过switch或者if else就可以实现啦。
1 /// <summary> 2 /// 根据上下文调用不同的方法 3 /// </summary> 4 /// <param name="name">string</param> 5 /// <param name="lang">enum</param> 6 private static void Say(string name, Language lang) 7 { 8 switch (lang) 9 { 10 case Language.Chinese: 11 Program.ChineseSpeaker(name); 12 break; 13 case Language.English: 14 Program.EnglishSpeaker(name); 15 break; 16 default : 17 break; 18 } 19 }
但假设我们现在又要增加新的语言西班牙语,同样我们可以增加西班牙语,但我们必须修改switch语句增加判断,这不符合OOP中的OCP(对扩展开放,对修改关闭原则),这时候委托该登场。
1 /// <summary> 2 /// Define speak delegate. 3 /// </summary> 4 /// <param name="name"></param> 5 private delegate void SpeakDelegate(string name);
首先我们定义了一种委托类型SpeakDelegate,然后我们通过修改Say方法看看该如何使用委托变量。
1 /// <summary> 2 /// The base say function. 3 /// </summary> 4 /// <param name="name">The name.</param> 5 /// <param name="speaker">The speaker.</param> 6 private static void Say(string name, SpeakDelegate speaker) 7 { 8 ///Inoke the speaker function. 9 speaker(name); 10 }
现在我们的参数已经不是枚举类型了,而是一个委托类型变量,而且实现的具体代码也没有了switch语句了,比之前简单了许多。现在大家知道如何去调用Say方法吧!没错我们只需传递一个name和一个具体实现函数名就OK了。
1 ///传递函数名进行委托方法绑定 2 Program.Say("钧航", ChineseSpeaker); 3 Program.Say("JK.Rush", EnglishSpeaker);
来源:http://www.jzxue.com/wangzhankaifa/asp-net/201104/24-7245.html