C# 委托

2019-10-24  本文已影响0人  李霖弢

委托类型表示对具有特定参数列表和返回类型的方法的引用(类似JS的函数指针,但类型安全)。
委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。
静态方法和实例方法均可委托。
通过关键词delegate声明委托。

using System;
delegate double Function(double x);
class Multiplier
{
    double factor;
    public Multiplier(double factor) 
    {
        this.factor = factor;
    }
    public double Multiply(double x) 
    {
        return x * factor;
    }
}
class DelegateExample
{
    static double Square(double x) 
    {
        return x * x;
    }
    static double[] Apply(double[] a, Function f) 
    {
        double[] result = new double[a.Length];
        for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
        return result;
    }
    static void Main() 
    {
        double[] a = {0.0, 0.5, 1.0};
        double[] squares = Apply(a, Square);
        double[] sines = Apply(a, Math.Sin);
        Multiplier m = new Multiplier(2.0);
        Function MyFunction = m.Multiply;
        double[] doubles =  Apply(a, MyFunction );
    }
}

简单的函数也可以用匿名函数形式直接当作参数传入。

double[] doubles =  Apply(a, (double x) => x * 2.0);

调用时,委托可以调用多个方法。 这被称为多播
通过+-+=-=进行添加/删除方法。方法会按加入的顺序依次执行。
如果委托具有返回值和/或输出参数,它将返回最后一个调用方法的返回值和参数。

delegate int MyFunction(int a, int b);
class Test
{
    static int MyAdd(int a, int b)
    {
        Console.WriteLine(a + b);
        return a + b;
    }
    static int MyMinus(int a, int b)
    {
        Console.WriteLine(a - b);
        return a - b;
    }
    public Test(int a, int b)
    {
        MyFunction myFunction = MyAdd;
        myFunction += MyMinus;
        myFunction += MyMinus;
        myFunction -= MyMinus;
        Console.WriteLine(myFunction(a, b));
    }
}
...
new Test(10, 20);//30 -10 -10
上一篇 下一篇

猜你喜欢

热点阅读