C# 通用委托
C# 通用委托
委托类型可以包含通用类型参数。例如:
public delegate T Converter<T> (T arg);
有了这个定义,我们可以编写一个适用于任何类型的通用方法:
public class Util { public static void Process<T> (T[] values, Converter<T> t) { for (int i = 0; i < values.Length; i++) values[i] = t (values[i]); } } class Main { static void Main() { int[] values = { 1, 2, 3 }; Util.Process (values, Square); // Hook in Square foreach (int i in values){ Console.Write (i + " "); // 1 4 9 } } static int Square (int x) { return x * x; } }
Func 和 Action委托
使用通用委托,我们可以写一小组委托类型来覆盖任何返回类型和任意数量的参数的方法。
这些委托是Func
和Action
委托,在系统命名空间中定义:
delegate TResult Func <out TResult> (); delegate TResult Func <in T, out TResult> (T arg); delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);
...等等,直到 T16
delegate void Action (); delegate void Action <in T> (T arg); delegate void Action <in T1, in T2> (T1 arg1, T2 arg2);
...等等,直到 T16
这些代表可以覆盖几乎所有的方法。
例子
以下代码显示了如何使用Func
委托,该委托接受T类型的单个参数并返回相同类型的值:
public static void Process<T> (T[] values, Func<T,T> transformer) { for (int i = 0; i < values.Length; i++) values[i] = transformer (values[i]); }
这些代理没有涉及的唯一实际场景是ref
/out
和指针参数。
代理类型彼此不兼容,即使它们的签名相同。
如果它们以相同的顺序引用相同的方法,则多播委托被认为是相等的。