C# Action<T>和 Func<T>委托

除了为每个参数和返回类型定义一个新委托类型之外,还可以使用 Action<T> 和 Func<T>委托。泛型 Action<T>委托表示引用一个 void 返回类型的方法。这个委托类存在不同的变体,可以传递至多 16 种不同的参数类型。没有泛型参数的 Action 类可调用没有参数的方法。Action<in T>调用带一个参数的方法,Action<in T1,in T2>调用带两个参数的方法,Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8>调用带 8 个参数的方法。.

Func<T>委托可以以类似的方式使用。Func<T>允许调用带返回类型的方法。与Action<t>类似,Func<T>也定义了不同的变体,至多也可以传递 16 个参数类型和一个返回类型。Func<out TResult>委托类型可以调用带返回类型且无参数的方法,Func<in T,out TResult>调用带一个参数的方法,Func<in T1,in T2,in T3,in T4,out TResult>调用带 4 个参数的方法。

声明一个委托参数是 double 类型,返回类型是 double:

delegate double DoubleOp(double x);

除了声明自定义委托 DoubleOp 之外,还可以使用 Func<in T,out TResult>委托。可以声明一个该委托类型的变量,或者声明该委托类型的数组,如下所示:

Func<double,double>[] operations= 
{
    MathOperations.MultiplyByTwo,
    MathOperations.Square
};

使用该委托,并将 ProcessAndDisplayNumber()方法作为参数:

static void ProcessAndDisplayNumber(Func<double, double>action, double value)
{
    double result = action(value);
    Console.WriteLine($"Value is {value}, result of operation is {result}"); 
}