C# - 函数委托 Func delegate

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;

匿名方法 和 C# Func

您可以使用 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之间的数
    }
}

Lambda 表达式 和 C# Func

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;
    }
}

要记住的要点:

  • Func 是内置的委托类型。
  • Func 委托类型必须返回一个值。
  • Func 委托类型可以有 0 到 16 个输入参数。
  • Func 委托不允许 ref 和 out 参数。
  • Func 委托类型可以与匿名方法或 lambda 表达式一起使用。
上一篇:C# 委托
下一篇:C# action委托
最近更新的
...