声明委托类型
以下语法创建名为 NumberInOutDelegate
的 delegate
类型,表示采用 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);
还支持代理,其中一些参数由 ref
或 out
修改,如:
public delegate bool TryParser<T>(string input, out T result);
(示例使用 TryParser<decimal> example = decimal.TryParse;
),或最后一个参数具有 params
修饰符的代理。委托类型可以具有可选参数(提供默认值)。委托类型可以在签名或返回类型中使用指针类型,如 int*
或 char*
(使用 unsafe
关键字)。委托类型及其参数可以携带自定义属性。