C# - 函数委托(Func Delegate)

本文关键字:Func Delegate 函数 | 更新日期: 2023-09-12 17:40:11

C# 包括内置的泛型委托类型FuncAction,因此在大多数情况下无需手动定义自定义委托。

Func 是包含在 System 命名空间中的泛型委托。它具有零个或多个输入参数和一个输出参数。最后一个参数被视为 out 参数。

接受一个输入参数和一个 out 参数的 Func 委托在 System 命名空间中定义,如下所示:

namespace System
{    
    public delegate TResult Func<in T, out TResult>(T arg);
}

尖括号<>中的最后一个参数被视为返回类型,其余参数被视为输入参数类型,如下图所示。

Func delegate

具有两个输入参数和一个输出参数的 Func 委托将如下所示。

Func delegate

以下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;

具有匿名方法的 C# 函数

可以使用委托关键字将匿名方法分配给 Func 委托。

Func<int> getRandomNumber = delegate()
                            {
                                Random rnd = new Random();
                                return rnd.Next(1, 100);
                            };

Func with Lambda 表达式

Func 委托也可以与 lambda 表达式一起使用,如下所示:

Func<int> getRandomNumber = () => new Random().Next(1, 100);
//Or 
Func<int, int, int>  Sum  = (x, y) => x + y;

注意:

  1. Func 是内置的委托类型。
  2. 函数委托类型必须返回一个值。
  3. 函数委托类型可以有 0 到 16 个输入参数。
  4. 函数委托不允许引用和输出参数。
  5. Func 委托类型可以与匿名方法一起使用,也可以与lambda 表达式一起使用。