C# 代理与事件上(delegate)

C# 代理与事件共分为上下两篇,是我在学习该方面知识时记录的随笔!

文章索引:

C# 代理与事件上(delegate)

C# 代理与事件下(event)

 

C#代理概述

代理(delegate)是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。但它与普通的类不同的是delegate能够拥有一个签名,并且它只能持有与它的签名相匹配的方法的引用。

代理类似于C/C++ 中的函数指针极为类似,可以直接指向某一函数。但他拥有函数指针不具备的有点:

1、函数指针只能指向静态函数,但delegate既可以引用静态函数,又可以引用非静态成员函数。

2、与函数指针相比,delegate是面向对象,类型安全且受控的对象。即runtime能保证delegate指向一个有效的方法,不必要担心delegate会指向无效地址。

C++函数指针

int (* Test) (int l); //定义函数指针
//以下定义了两个处理函数,程序会根据情况调用不同的过程
int Add(int t)
{
    return t+ t;
}

int Mut(int t)
{
    return t*t;
}
//把函数做参数
int test2(int t,int (* p) (int ))
{
    return p(t);
}
int main(int argc, char* argv[])
{
    char input[8];
    printf("Please Input a Number!\n");
    scanf("%s",input);
    int t = atoi(input);
    int p;
    //大于10,此指针指向Add()
    if(t > 10)
    Test = Add;
    //小于10,此指针指向Mut()
    else
    Test = Mut;
    //通过指针调用
    p =  Test(t);
     printf("The Result is %d",p);
    if(t > 10)
    p = test2(t,Add);
    //小于10,此指针指向Mut()
    else
    p = test2(t,Mut);
    return 0;
}

代码中 p = test2(t,Add)和 p = test2(t,Mut)与delegate极为相似。

C# delegate

//声明一个代理的例子: 
public delegate int MyDelegate(int t);

class program
{
 
    //我们与传递的方法,方法的参数和返回类型必须和申明的代理相同  
    private static int Add(int t)
    {
    return t+t;  
    }
    private static int Mul(int t)  
    {    
        return t*t;  
    }   
    private int Operation(int t,MyDelegate OperationDelegate)  
    {    
        OperationDelegate(t);  
    }  
    static void Main(string[] args)  
    {    
        Operation(10,Add);   
        Operation(10,Mul);  
    }
}

将方法绑定到委托

 public delegate int MyDelegate(int t);

 
class program
{
  //我们与传递的方法,方法的参数和返回类型必须和申明的代理相同  
   private static int Add(int t)
   {
    return t+t;  
   }
   private static int Mul(int t)  
   {   
       return t*t;  
   }   
   private int Operation(int t,MyDelegate OperationDelegate)  
   {   
       OperationDelegate(t);  
   }  
   static void Main(string[] args)  
   {    
       MyDelegate delegate1,delegate2;    
       delegate1=Add;    
       delegate2=Mul;       
       Operation(10,delegate1);    
       Operation(10,delegate2);     
       //绑定多个方法    
       MyDelegate delegate3;    
       delegate3=Add;//绑定第一个方法,此为赋值语句,第一次不能使用“+=”    
       delegate3+=Mul;//绑定另一个方法 ,此为绑定语句    
       Operation(10,delegate3);     //取消某个绑定    
       delegate3-=Mul;//取消第二个绑定    
       Operation(10,delegate3);  
   }
}

总结

1、委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,同时使得程序具有更好的可扩展性。

2、使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

参考

1、C# 中的委托和事件(Jimmy Zhang )

  

 

 

 

 

原文地址:https://www.cnblogs.com/xinai/p/2483401.html