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 )

      

     

     

     

     

  • 相关阅读:
    LeetCode Power of Three
    LeetCode Nim Game
    LeetCode,ugly number
    LeetCode Binary Tree Paths
    LeetCode Word Pattern
    LeetCode Bulls and Cows
    LeeCode Odd Even Linked List
    LeetCode twoSum
    549. Binary Tree Longest Consecutive Sequence II
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/xinai/p/2483401.html
Copyright © 2011-2022 走看看