Asp.net中的委托
相信大家也不是第一次听说过委托这个概念,之前一直了解,却没有去好好地总结,正好最近有机会,让我们来看看到底什么是委托吧?
首先,我们要知道什么是委托?
委托是一种特殊的类型(class),用途是来实现对一种方法的封装。在某种事件发生时,自动调用该方法。
一个委托代表了具有相同参数列表和返回值的所有函数。类是对象的抽象,委托是函数的抽象。
简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。
其次,定义知道了,怎么去用呢?可以把委托的使用分为四部:
1.定义一种委托。
2.委托执行时要调用方法。
3.定义一个委托实例。
4.委托实例的调用。
<div><pre name="code" class="csharp"><span style="font-size:18px;"> //定义一种委托。 delegate int GetCalculatedValueDelegate(int x, int y); //委托执行时要调用方法。 static int AddCalculator(int x, int y) { return x + y; } static int SubCalculator(int x, int y) { return x - y; } static void Main(string[] args) { //定义一个委托实例。 GetCalculatedValueDelegate d = AddCalculator; //委托实例的调用。 Console.WriteLine(d(10, 20)); } </span>
这样,我们就会发现,其实委托没有我们想象中的那么难。
最后,我们为什么要用它,它有什么优点?我们再来看一个例子。
<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary> /// the English speaker. /// </summary> /// <param name="name">The name.</param> public void EnglishSpeaker(string name) { Console.WriteLine( string.Format("Hello my name is {0} and I am English speaker.\n", name)); } /// <summary> /// the Chineses speaker. /// </summary> public void ChineseSpeaker(string name) { Console.WriteLine( string.Format("您好我的名字叫{0},我是讲普通话的。\n", name)); } /// <summary> /// 根据上下文调用不同的方法 /// </summary> /// <param name="name">string</param> /// <param name="lang">enum</param> private static void Say(string name, Language lang) { switch (lang) { case Language.Chinese: Program.ChineseSpeaker(name); break; case Language.English: Program.EnglishSpeaker(name); break; default : break; } } /// <summary> /// Define speak delegate. /// </summary> /// <param name="name"></param> private delegate void SpeakDelegate(string name); /// <summary> /// The base say function. /// </summary> /// <param name="name">The name.</param> /// <param name="speaker">The speaker.</param> private static void Say(string name, SpeakDelegate speaker) { ///Inoke the speaker function. speaker(name); } ///传递函数名进行委托方法绑定 Program.Say("钧航", ChineseSpeaker); Program.Say("JK.Rush", EnglishSpeaker);</span>其实,这上面的也是四部。只不过通过这个例子,我们可以发现委托的优点。
我们可以这样子认为:委托是一个类,它定义了方法的类型,使得可以将方法当作别一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托没有想象的那么难,但是委托常常不会自己出现,就好比我们最近做的云平台底层,委托常常与泛型、反射等等一起出现,这样会造成一个假象,使我们觉得委托很难。这时候,我们应该逐一击破,到最后你会发现它没有那么难。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。