声明委托类型

以下语法创建名为 NumberInOutDelegatedelegate 类型,表示采用 int 并返回 int 的方法。

public delegate int NumberInOutDelegate(int input);

这可以使用如下:

public static class Program
{
    static void Main()
    {
        NumberInOutDelegate square = MathDelegates.Square;
        int answer1 = square(4); 
        Console.WriteLine(answer1); // Will output 16

        NumberInOutDelegate cube = MathDelegates.Cube;
        int answer2 = cube(4);
        Console.WriteLine(answer2); // Will output 64            
    }
}

public static class MathDelegates
{
    static int Square (int x)
    {
        return x*x;
    }

    static int Cube (int x)
    {
        return x*x*x;
    }
}

example 委托实例的执行方式与 Square 方法相同。委托实例字面上充当调用者的委托:调用者调用委托,然后委托调用目标方法。此间接寻址将调用者与目标方法分离。

你可以声明一个通用委托类型,在这种情况下,你可以在某些类型参数中指定该类型是协变(out)或逆变(in)。例如:

public delegate TTo Converter<in TFrom, out TTo>(TFrom input);

与其他泛型类型一样,泛型委托类型可以具有约束,例如 where TFrom : struct, IConvertible where TTo : new()

避免用于多播委托的委托类型的共同和逆变,例如事件处理程序类型。这是因为如果运行时类型由于方差而与编译时类型不同,则连接(+)可能会失败。例如,避免:

public delegate void EventHandler<in TEventArgs>(object sender, TEventArgs e);

相反,使用不变的泛型类型:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

还支持代理,其中一些参数由 refout 修改,如:

public delegate bool TryParser<T>(string input, out T result);

(示例使用 TryParser<decimal> example = decimal.TryParse;),或最后一个参数具有 params 修饰符的代理。委托类型可以具有可选参数(提供默认值)。委托类型可以在签名或返回类型中使用指针类型,如 int*char*(使用 unsafe 关键字)。委托类型及其参数可以携带自定义属性。