委托就是一个方法,一个没有代码块并且能作为参数的方法。
(注:这里的委托是指委托对象而不是委托类,因为委托的类与实例化的对象都被称为“委托”)
其实直接说委托就是一个方法并不准确,但这样也不无道理且更容易理解,下面细细道来。
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的基础。所以吃透委托非常重要,本人自从接触委托到现在有半年时间了,还一直在不断参透中,也许文中也有不对的地方欢迎指正,共同进步。