5.10C#引用类型之委托(Delegate)

委托声明

delegate 返回类型 委托名称<类型变量>(可选参数); 

委托类型 表示对具有特定参数列表和返回类型的方法的引用。 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。 委托还类似于其他一些语言中存在的“函数指针”概念。 与函数指针不同,委托是面向对象且类型安全的。

具有相同参数列表和返回类型的两个不同的委托类型被视为不同的委托类型。

委托兼容性

方法或委托M 与 委托 D 的兼容必须遵循以下所有条件:

  • D 和 M 的返回类型应该相同。
  • D 和 M 的 参数修饰符、参数类型、参数数量也应该相同。

委托实例化

delegate void D(int x);

class C
{   

    // 静态方法
    public static void M1(int i) {...}

    // 实例方法
    public void M2(int i) {...}
}

class Test
{
    static void Main() { 
        D cd1 = new D(C.M1);        
        C t = new C();
        D cd2 = new D(t.M2);
        // 另一个委托        
        D cd3 = new D(cd2);        
    }
}

下面的示例声明并使用 Function 委托类型。

delegate double Function(double x);

class Multiplier
{
    double _factor;
    
    public Multiplier(double factor) => _factor = factor;
    
    public double Multiply(double x) => x * _factor;
}

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

Function 委托类型实例可以引用需要使用 double 类型的实参并返回 double 类型的值的方法。 Apply 方法将给定的 Function 应用于 double[] 的元素,从而返回包含结果的 double[]。 在 Main 方法中,Apply 用于向 double[] 应用三个不同的函数。

委托可以引用静态方法(如上面示例中的 Square 或 Math.Sin)或实例方法(如上面示例中的 m.Multiply)。引用实例方法的委托还会引用特定对象,通过委托调用实例方法时,该对象会变成调用中的 this

还可以使用匿名函数创建委托,这些函数是在声明时创建的“内联方法”。 匿名函数可以查看周围方法的局部变量。 以下示例不创建类:

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

委托不知道或不在意其所引用的方法的类。 引用的方法必须具有与委托相同的参数类型和返回类型。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/back/csharp/8286.html

发表评论

登录后才能评论