本章内容:
8.1.3 简单的委托示例
首先定义一个类MathOperations,它有两个静态方法,对double类型的值执行两个操作。
public class MathOperations { public static double MultiplyByTwo(double value) { return value*2; } public static double Square(double value) { return value*value; } }
下面使用自定义的委托调用这两个方法
internal delegate double DoubleOp(double x);
private static void Main() { DoubleOp[] operations = { MathOperations.MultiplyByTwo, MathOperations.Square }; for (var i = 0; i < operations.Length; i++) { Console.WriteLine("Using operations[{0}]", i); ProcessAndDisplayNumber(operations[i], 2.0); ProcessAndDisplayNumber(operations[i], 7.94); ProcessAndDisplayNumber(operations[i], 1.141); Console.WriteLine(); } Console.ReadLine();
} private static void ProcessAndDisplayNumber(DoubleOp action, double value) { var result = action(value); Console.WriteLine("Value is {0},result of operation is {1}", value, result); }
运行这个示例,得到如下所示的代码:
8.1.4 Action<T>和Func<T>委托
除了自定义的委托类型外,我们还可以使用Action<T>委托和Func<T>委托。
泛型Action<T>委托表示引用一个void返回类型的方法,因为这个委托类存在不同的变体,所以可以传递至多16种不同的参数类型,没有泛型参数的Action类可调用
没有参数的方法。
Func<T>允许调用带返回类型的方法,与Action<T>类似,Func<T>也定义了不同的变体,至多也可以传递16个参数类型和一个返回类型。Func<out TResult>
委托类型可以调用带返回类型且无参数的方法。
理解了这两个委托后,我们就可以将上一节种定义的DoubleOp委托删除,改为Func<T>委托,如下所示:
Func<double,double> [] operations = { MathOperations.MultiplyByTwo, MathOperations.Square };
然后修改ProcessAndDisplayNumber方法的第一个参数类型,如下所示:
private static void ProcessAndDisplayNumber(Func<double,double> action, double value) { var result = action(value); Console.WriteLine("Value is {0},result of operation is {1}", value, result); }