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

原文地址:https://www.cnblogs.com/zeng-qh/p/10978233.html