.NET委托的基本原理

[ 492 查看 / 0 回复 ]

所涉及到的知识点 •    委托的基本原理 •    委托类型继承结构   分析问题   委托这一概念对于有过C++经验的程序员来说并不陌生,C++中的函数指针和委托确实非常类似,很多程序员也很喜欢把.NET中的委托称呼为安全的函数指针,无论这一说法是否正确,但委托确实实现了和函数指针非常类似的功能,那就是提供了程序回调指定方法的机制。   在委托的内部,包含了一个指向某个方法的指针,在这一点上,委托的实现机制和C++的函数指针完全相同。之所以称委托是安全的,是因为委托和其他所有的.NET成员一样,是一种类型,任何委托对象都是System. Delegate的某个派生类的一个对象,在.NET框架中,任何自定义的委托都继承自祖父类System.Delegate。在这个类中,定义了大部分委托的特性,而关于System.MulticastDelegate的特性,将在后续章节中有所覆盖。现在来分析一个具体的例子。 代码6-1  一个简单的委托:SimpleDelegate.cs using System; namespace NET.MST.Sixth.SimpleDelegate {     class SimpleDelegate     {         /// <summary>         /// 定义的委托。         /// </summary>         /// <param name="i">接受一个整型参数</i>         public delegate void TestDelegate(int i);         static void Main(string[] args)         {             //调用委托方法             TestDelegate d = new TestDelegate(PrintMessage1);             d(0);             d(1);             Console.Read();         }         /// <summary>         /// 一个静态方法,符合TestDelegate的定义         /// </summary>         /// <param name="i">整型参数</param>         static void PrintMessage1(int i)         {             Console.WriteLine("第" + i + "个方法");         }     } } 在代码6-1中,首先通过public delegate void TestDelegate(int i);定义了一种名为TestDelegate的新类型,该类型继承自System.MulticastDelegate。而且它会包含一个名为Invoke的方法,该方法接受一个整数型的参数并没有任何返回。这些步骤都是由C#编译器自动完成的。 然后,申明了一个TestDelegate的对象d,并且绑定了一个静态的方法void PrintMessage1(int i)到该委托上。在这里读者需要注意的是,委托既可以接受实例方法,也可以接受静态方法,其中的内在区别将在本章后文中有所覆盖。最后,也是最令人期待的部分,d被调用执行:d(0); d(1); 在这里读者可能会对这个形式的代码产生困惑,事实上,这只是C#设计者们为了简化程序员的输入而设计的一种语法而已。 本质上,委托的调用就是执行了在定义委托时所生成的Invoke方法。 为了容易理解,读者完全可以尝试把委托的调用部分写成如下形式: d.Invoke(0); d.Invoke(1); 当执行委托时,.NET检查委托对象并找到PrintMessage1(int i)方法,然后把参数传递给该方法并且执行。 下面是这段小程序的执行结果: 第0个方法 第1个方法   答案 委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序.
分享 转发
TOP