一句话说明白什么是委托

委托就是一个方法,一个没有代码块并且能作为参数的方法。

(注:这里的委托是指委托对象而不是委托类,因为委托的类与实例化的对象都被称为“委托”)

    其实直接说委托就是一个方法并不准确,但这样也不无道理且更容易理解,下面细细道来。

1.为什么说委托就是一个方法?

先看代码:

using System;
namespace 委托demo控制台
{    
    class Program
    {
        public delegate void DoWork(string str);
        static void Main(string[] args)
        {
            DoWork dowork = Work;
            dowork("Hi,I'm Wangzhengkun!");
        }
        public static void Work(string str)
        {
            Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}
运行结果:

一句话说明白什么是委托

        咱们一步一步来解释代码,首先看这一段:

static void Main(string[] args)
        {
            DoWork dowork = Work;
            dowork("Hi,I'm Wangzhengkun!");
        }


        主要看这一句:

dowork("Hi,I'm Wangzhengkun!");
          如果不看其他的,其实这就是一个标准的方法调用。方法名称是dowork,参数是string类型的“Hi,I'm Wangzhengkun”

      所以说:委托其实就是一个方法

再看他上面的这一句:

DoWork dowork = Work;
           这里声明了dowork,然后将Work赋值给了dowork。

     重点来了啊,我们声明dowork之后把一个实际的方法Work直接赋值给了dowork,然后dowork就能和Work一样使用

     为啥要叫委托呢?委托,就是Work委托dowork去做本该由Work去做的事情。所以把dowork叫做委托。

2.委托是一个类型

          上面不是刚刚说了委托是方法么?怎么又成了类了?

    原因在于在C#中对象与类型都叫委托

看下面代码

            DoWork dowork = Work;
         这是一个典型定义一个变量的一句代码,和int a=0完全一样,DoWork是类型如同int,只不过这个类型是我们自己定义的,定义的代码是这句:

public delegate void DoWork(string str);
        所以在下面这句代码中
DoWork dowork = Work;

        dowork叫委托,Dowork也叫委托。在上一节中说的委托是一个方法说的是dowork,而在这里说委托是类型说的是Dowork。

3.委托的定义

public delegate void DoWork(string str);
         在上面这句代码中就定义了委托DoWork,定义它的关键词是delegate。

    比较重要的是参数返回值类型参数返回值类型加起来被称作签名),因为委托的签名必须要和将要绑定到委托上的方法的签名一致。

    也就是说DoWork的返回值类型是void,参数只有一个且类型是string,那么绑定到dowork(DoWork的实例)上的方法Work的返回值类型也得是void,参数也只有一个且是string。这样才能把Work绑定(或者是赋值)到dowork。

4.委托的作用——将方法作为方法的参数

        以上三节应该能把委托理解了,那么委托的作用是啥?如同上面的例子,我为啥不直接调用Work呢?

    委托的做就是一句话:“将方法作为方法的参数”。这句话好多好多人解释过这里暂不多费笔墨,具体的例子看这位仁兄写的博文http://www.cnblogs.com/xiaofengfeng/archive/2011/12/02/2271732.html个人觉得文章中的例子还是非常好的,再有就是去MSDN上看例子。

5.总结

    文章开头说的:委托就是一个方法其实并不十分准确,太片面,如同苹果就是苹果再怎么像桃子他也不是桃子。所以说委托就是委托,委托很像一个方法却不能直接片面的说他就是一个方法,但个人觉得用这么一句不准确的话来理解委托还是挺合适的一句话说明白什么是委托

6.其他

    委托是事件的基础,只有深入了解了委托才能真正明白事件。委托还和多线程有关(异步委托的调用),还和Lambda表达式有关(匿名委托)而Lambda表达式又是LINQ的基础。所以吃透委托非常重要,本人自从接触委托到现在有半年时间了,还一直在不断参透中,也许文中也有不对的地方欢迎指正,共同进步。


















上一篇:关于Image newImage = Image.FromFile("SampImag.jpg");的问题


下一篇:制作自己的java类库