委托
分析问题
委托这一概念对于有过C++经验的程序员来说并不陌生,C++中的函数指针和委托确实非常相似,许多程序员也喜欢把.NET中的委托称呼为安全的函数指针,无论这一说法是否正确,但委托确实实现了和函数指针非常类似的功能,那就是提供了程序回调指定方法的机制。
在委托的内部,包含了一个指向某个方法的指针,在这一点上,委托的实现机制和C++的函数指针完成相同。之所以称猥琐是安全的,是因为委托和其他所有的.NET成员一样,是一种类型,任何委托对象都是System.Delegate的某个派生类的一个对象,在.NET框架中,委托的类结构如下图所示。

从这个结构中可以看出,任何自定义的委托都继承自祖父类System.Delegate。在这个类中,定义了大部分委托的特性,而关于System.MulticastDelegate的特性,将在后续章节中有所覆盖。现在来分析一个具体的例子。
using System; namespace Test { class SimpleDelegate { /// <summary> /// 定义的委托。 /// </summary> /// <param name="i">接受一个整形参数</param> public delegate void TestDelegate(int i); static void Main() { //调用委托方法 TestDelegate d = new TestDelegate(PrintMessage); d(0); d(1); Console.Read(); } static void PrintMessage(int i) { Console.WriteLine("第{0}个方法。",i); } } }
在以上代码中,首先通过public delegate void TestDelegate(int i);定义了一种名为TestDelegate的新类型,该类型继承自System.MulticastDelegate。而且它会包含一个名为Invoke的方法,该方法接受一个整数型的参数并没有任何返回。这些步骤都是有C#编译器自动完成的。
然后,申明了一个TestDelegate的对象d,并且绑定了一个静态的方法void PrintMessage(int i)到该委托上。在这里读者需要注意的是,委托既可以接受实例方法,也可以接受静态方法,其中的内在区别将在本章后文中有所覆盖。最后,也是最令人期待的部分,d被调用执行:d(0);d(1);在这里读者可能会对这个形式的代码产生困惑,事实上,这只是C#设计者们为了简化程序员的输入而设计的一种语法而已。
注意
本质上,委托的调用就是执行了在定义委托时所生成的Invoke方法。
为了容易理解,读者完全可以尝试把委托的调用部分写成如下形式:
d.Invoke(0);
d.Invoke(1);
当执行委托时,.NET检查委托对象并找到PrintMessage(int i)方法,然后把参数传递给该方法并且执行。
下面是这段小程序的执行结果:

答案
委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更佳简洁优美的面向对象程序。
posted on 2014-08-25 16:31 wangjinpeng_study 阅读(139) 评论(0) 收藏 举报
浙公网安备 33010602011771号