zoukankan      html  css  js  c++  java
  • c# 委托 delegate

    委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途

    通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法。

    1. 使用委托

    委托的使用需要以下步骤:

    定义委托

    delegate double ParocessDelegate(double param1,double param2);

    委托的定义非常类似于函数,但不带函数体,且要使用delegate关键字。委托定义需要指明委托名称以及一个返回类型和一个参数列表

    声明委托类型的变量

    ProcessDelegate process;

    定义了委托后,就可以声明一个该委托类型的变量

    初始化委托变量

    process =new ProcessDelegate(Multiply);

    初始化委托变量时要把一个函数(此处Multiply为一个函数的名称)引用赋给委托变量,此函数需要具有与委托相同的返回类型和参数列表。c#使用上述略显古怪的语法,使用new关键字创建一个新的委托,参数为
    要引用所需的函数,这是委托赋值的一个独特语法,函数名称是不带括号的

    还可以用另一种略微简单的语法

    process = Muiltiply;

    有了引用函数的委托变量之后,我们就可以用委托变量调用Muiltiply函数;也可以把委托变量传递给其他函数

    process (param1,param2);

    示例:

    复制代码
    namespace Delegate
    {
    
            public delegate int Call(int num1, int num2);//第一步:定义委托类型
            class SimpleMath
            {
                // 乘法方法
                public int Multiply(int num1, int num2)
                {
                    return num1 * num2;
                }
    
                // 除法方法
                public int Divide(int num1, int num2)
                {
                    return num1 / num2;
                }
            }
        }
        class Test
        {
            static void Main(string[] args)
            {
                Call objCall;//第二步:声明委托变量
                // Math 类的对象
                SimpleMath objMath = new SimpleMath(); 
                // 第三步:初始化委托变量,将方法与委托关联起来
                objCall = new Call(objMath.Multiply);
    
               
                objCall += objMath.Divide;//向委托增加一个方法
                //objCall -=  objMath.Divide;//向委托减去一个方法
    
                // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide
                int result = objCall(5, 3);
                System.Console.WriteLine("结果为 {0}", result);
                Console.ReadKey();
            }
        }
    复制代码

    注意事项:

    • 委托可以调用多个方法,即一个委托变量可以引用多个函数,称为多路广播
    • 可以使用+=和-=运算符实现方法的增加和减少
    • 无返回值的委托,引用了多少个方法就会执行多少个方法。有返回值的委托同样会执行多个引用的方法,但返回的值是最后一个方法的返回值

      2.  其他形式的委托

    • 匿名委托

    匿名委托使用起来更简洁一点,不用在定义一个专用的委托函数来传递方法,也更可以更好的理解委托

    复制代码
      //定义委托
        delegate string lookMe(string s);
    
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            //匿名委托
            lookMe lm = delegate(string name) { return "亲爱的 " + name + ",请看着我的眼睛!"; };
    
            //匿名委托调用
            string name1 = "jarod";
            Label1.Text = lm(name1);
        }
    复制代码
    • 泛型委托

    Action<>,Func<>,Predicate<> 其实他们都是委托代理的简写形式,通过他们可以省去定义委托的步骤

    示例

    复制代码
    public static void HellowChinese(string strChinese)  
    {  
        Console.WriteLine("Good morning," + strChinese);  
        Console.ReadLine();  
    }  
      
    Action<string> action = HellowChinese;  
    action("Spring.");  
    复制代码

    其中Action是无返回值的泛型委托,Func是有返回值的泛型委托,Predicate<>是返回bool类型的委托,他们都有多个参数的重载版本

       3.  委托的各种写法

    复制代码
    public delegate int DelegateProcess(int num1, int num2);
    
    //第一种写法
    DelegateProcess process= new DelegateProcess(Multiply);
    
    //第二种写法
    DelegateProcess process= Multiply;
    
    //第三种写法  匿名委托
    DelegateProcess process= delegate(int a,int b)
    {
       return a*b;
    }
    
    //第四种写法 Lamdba表达式
    DelegateProcess process =((int a,int b)=>{return a*b;});
    
    //第五种写法 Action<T>和Func<T>
    Action<int,int> process= ((int a,int b)=>{Console.WriteLine(a * b);});
    Func<int,int,int> process= ((int a,int b)=>{return a*b;});
  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/sjqq/p/7016090.html
Copyright © 2011-2022 走看看