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)语句,同时使得程序具有更好的可扩展性。

    委托没有想象的那么难,但是委托常常不会自己出现,就好比我们最近做的云平台底层,委托常常与泛型、反射等等一起出现,这样会造成一个假象,使我们觉得委托很难。这时候,我们应该逐一击破,到最后你会发现它没有那么难。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。