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

    委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。

    委托的使用:

    * 方法的签名必须和委托一致,方法签名包括参数的个数,类型和顺序
    * 方法的返回值类型要和委托一致

    * 定义委托
    * 声明委托变量
    * 实例化委托类型
    * 将委托作为参数传递

     Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

    Func可以接受0个至16个传入参数,必须具有返回值

    Action可以接受0个至16个传入参数,无返回值

    Predicate只能接受一个传入参数,返回值为bool类型

    public delegate int Mydelgate(int x, int y);//定义委托
        class Program
        {
            static void Main(string[] args)
            {
    
                student stu = new student();
                Mydelgate Mydelegate1 = new Mydelgate(stu.add);//传入stu.add 方法
                Mydelgate Mydelegate2 = new Mydelgate(stu.mul);
                //Mydel Mydelegate3 = delegate (int x, int u) { return stu.add(x, u); };
                var add = Mydelegate1(2, 6);//调用委托    或Mydelegate.Invoke(2, 6);
                Console.WriteLine(add);
                //委托可以调用多个方法。 这被称为多播。 若要向委托的方法列表(调用列表)添加其他方法,
                //只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托。
                Mydelegate1 += Mydelegate2;
                Console.WriteLine(Mydelegate1(5, 5));//先调用mydelegete1  再调用mydelegete2  
    
    
                //用lambda 表达式更加简洁
                Mydelgate addition = (p, x) => (p + x);
                Mydelgate subtraction = (p, x) => (p - x);
                Mydelgate multiplication = (p, x) => (p * x);
                Mydelgate division = (p, x) => (p / x);
    
                Console.ReadKey();
            }
        }
        class student
        {
            public int add(int x, int y)
            {
                return x + y;
            }
            public int sub(int x, int y)
            {
                return x - y;
            }
            public int mul(int x, int y)
            {
                return x * y;
            }
    
        }

    图片来源:https://www.bilibili.com/video/av18906386?from=search&seid=3181193995352669498

     遍历多播委托,GetInvocationList
      Delegate[] delegates = Mydelegate.GetInvocationList();
     一般用多播委托都不用返回值

    可参考:https://www.cnblogs.com/sunliyuan/p/6036539.html   或  https://www.cnblogs.com/liuqiang18/p/9144807.html

    官方版本:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates

  • 相关阅读:
    merge into update
    buffer overflow
    在表中循环插入日期
    判断表是否存在 存储
    listagg( ) within group ( order by ) 与 wm_concat
    Oracle导入SQL脚本执行 scott 用户下的表删除了
    数据导入时注意点,修改登录密码不区分大小写
    分页
    创建触发器在表中播入数据时ID自动增长
    insert 另外一种用法
  • 原文地址:https://www.cnblogs.com/zeng-qh/p/10978233.html
Copyright © 2011-2022 走看看