C#包含内置的泛型委托类型 Func 和 Action,因此在大多数情况下您不需要手动定义自定义委托。
Func是包含在 System 命名空间中的泛型委托。它有零个或多个输入参数和一个 out 参数。最后一个参数被视为 out 参数。
Func 委托代表有返回类型的委托。
Func 在 System 命名空间中定义了一个 in 参数和一个 out 参数 的委托,如下所示:
namespace System { public delegate TResult Func<in T, out TResult>(T arg); }
尖括号中的最后一个参数<>被视为返回类型,其余参数被视为输入参数类型,如下图所示。
具有两个输入参数和一个输出参数的Func委托将如下所示。
以下Func委托接受两个int类型的输入参数,并返回一个int类型的值:
Func<int, int, int> sum;
您可以为上面的func委托分配任何方法,这些方法需要两个int参数并返回一个int值。
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个不同类型的输入参数。但是,它必须包含用于结果的out参数。例如,以下Func委托没有任何输入参数,并且仅包含out参数。
Func<int> getRandomNumber;
Func 至少0个输入参数,至多16个输入参数,根据返回值泛型返回。必须有返回值,不可void。
Func<int> 表示没有输入参数,返回值为int类型的委托。
Func<object,string,int> 表示传入参数为object, string ,返回值为int类型的委托。
Func<object,string,int> 表示传入参数为object, string, 返回值为int类型的委托。
Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型),返回值为int类型的委托。
您可以使用 delegate 关键字将匿名方法分配给 Func 委托。
Func<int> getRandomNumber = delegate() { Random rnd = new Random(); return rnd.Next(1, 100); };
Func委托也可以与lambda表达式一起使用,如下所示:
Func<int> getRandomNumber = () => new Random().Next(1, 100); //或者 Func<int, int, int> Sum = (x, y) => x + y;
Func 是内置委托类型。
Func 委托类型必须返回一个值。
Func 委托类型可以具有零到16个输入参数。
Func 委托不允许 ref 和 out参数。
Func 委托类型可以与匿名方法或lambda表达式一起使用。