C# 包括内置的泛型委托类型 Func 和 Action,因此在大多数情况下您不需要手动定义自定义委托。
Func 是包含在 System 命名空间中的通用委托。 它有零个或多个输入参数和一个输出参数。 最后一个参数被视为输出参数。
在 System 命名空间中定义了接受一个输入参数和一个输出参数的 Func 委托,如下所示:
namespace System
{
public delegate TResult Func<in T, out TResult>(T arg);
}
尖括号<>中的最后一个参数被认为是返回类型,其余参数被认为是输入参数类型,如下图所示。
具有两个输入参数和一个输出参数的 Func 委托将表示如下所示。
namespace System
{
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
}
我们可以用上面的Func来定义一个接受两个int输入一个int返回值的delegate,如下示例。 示例
using System;
namespace ConsoleApp1
{
class Program
{
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
Func<int, int, int> add = Sum;
int result = add(10, 10);
Console.WriteLine(result); //20
}
}
}
一个 Func 委托类型可以包含 0 到 16 个不同类型的输入参数。 但是,它必须包含结果的输出参数。 例如,下面的 Func 委托没有任何输入参数,它只包含一个输出参数。
Func<int> calculate;
您可以使用 delegate 关键字将匿名方法分配给 Func 委托。
class Program
{
static void Main(string[] args)
{
Func<int> getRandomNumber = delegate ()
{
Random rnd = new Random();
return rnd.Next(1, 100);
};
Console.WriteLine(getRandomNumber()); //随机输出 1-到100之间的数
}
}
Func 委托也可以与 lambda 表达式一起使用,如下所示:
class Program
{
static void Main(string[] args)
{
Func<int> getRandomNumber = () => new Random().Next(1, 100);
//上面的是下面的简写形式。只有一个返回值的时候可以这样写
Func<int> getRandomNumber2 = () => { return new Random().Next(1, 100); };
Console.WriteLine(getRandomNumber()); //随机输出 1-到100之间的数
Func<int, int, int> Sum = (x, y) => x + y;
}
}