C#中的事件处理实际上是一种具有特殊签名的delegate

时间:2022-04-04 06:50:42

一、delegate到底是什么对象

孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总风闻过吧,嗯,斗胆的报告你,你完全可以把delegate理 解成C中的函数指针,它允许你通报一个类A的要领m给另一个类B的东西,使得类B的东西能够挪用这个要领m,说白了就是可以把要领看成参数通报。不过 delegate和函数指针还是有点区另外,delegate有许多函数指针不具备的长处。首先,函数指针只能指向静态函数,而delegate既可以引 用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不单生存了对此函数入口指针的引用,而且还生存了挪用此函数的类实例的引用。其次,与函数指针相 比,delegate是面向东西、类型安适、可靠的受控(managed)东西。也就是说,runtime能够保证delegate指向一个有效的要领,, 你无须担忧delegate会指向无效地点或者越界地点。

有什么能比举个例子更能说明问题呢,代码才是硬原理,来吧,看几个例子吧:

第一个例子:

C#代码  

public class DelegateTest  

{  

     // 声明delegate东西   

     public delegate void CompareDelegate(int a,int b);  

     // 欲通报的要领,它与CompareDelegate具有不异的参数和返回值类型   

     public static void Compare(int a,int b)  

     {  

         Console.WriteLine((a>b).ToString());  

     }  

   

     public static void Main()  

     {  

         // 创建delegate东西   

         CompareDelegate cd = new CompareDelegate(DelegateTest.Compare);  

         // 挪用delegate   

         cd(1,2);  

     }  

}  

public class DelegateTest { // 声明delegate东西 public delegate void CompareDelegate(int a,int b); // 欲通报的要领,它与CompareDelegate具有不异的参数和返回值类型 public static void Compare(int a,int b) { Console.WriteLine((a>b).ToString()); } public static void Main() { // 创建delegate东西 CompareDelegate cd = new CompareDelegate(DelegateTest.Compare); // 挪用delegate cd(1,2); } }

再来一个例子:

C#代码  

public delegate void MyTestDelegate(int i);  

public class Program  

{  

    public static void Main()  

    {  

        //创建delegate  

        ReceiveDelegateArgsFunc(new MyTestDelegate(DelegateFunction));  

    }  

    //这个要领接收一个delegate类型的参数,也就是接收一个函数作为参数  

    public static void ReceiveDelegateArgsFunc(MyTestDelegate func)  

    {  

        func(21);  

    }  

    //欲通报的要领  

    public static void DelegateFunction(int i)  

    {  

        System.Console.WriteLine("传过来的参数为: {0}.", i);  

    }