委托

分析问题

  委托这一概念对于有过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)    收藏  举报

导航