zoukankan      html  css  js  c++  java
  • 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 )

      

     

     

     

     

  • 相关阅读:
    jQuery插件 -- Form表单插件jquery.form.js
    Ajax发送GET、POST请求和响应XML数据案例
    Ajax知识点复习
    Tomcat配置连接池的java实现
    dbcp数据库连接池的java实现
    C3P0数据库连接池的java实现
    推荐几款基于Bootstrap的响应式后台管理模板
    Java复习第四天
    Java复习第三天
    Java复习第二天
  • 原文地址:https://www.cnblogs.com/xinai/p/2483401.html
Copyright © 2011-2022 走看看