Func和Action和Predicate之间的区别[duplicate]

17 浏览
0 Comments

Func和Action和Predicate之间的区别[duplicate]

此问题已经有了答案:

代理:谓词 vs. 活动 vs. 函数

请问能否给出具体例子,帮助我理解以下内容:

  1. 我们何时需要使用Func<T, ..> 代理?
  2. 我们何时需要使用Action 代理?
  3. 我们何时需要使用Predicate 代理?
admin 更改状态以发布 2023年5月23日
0
0 Comments

Action是一个委托(指针),它可以指向一个方法,该方法可以带零个、一个或多个输入参数,但不返回任何内容。

Func是一个委托(指针),它可以指向一个方法,该方法可以带零个、一个或多个输入参数,并返回一个值(或引用)。

Predicate是一种特殊的Func,通常用于比较(带有一个泛型参数并返回bool类型)。

尽管在Linq中被广泛使用,但Action和Func是与Linq逻辑上独立的概念。C++已经包含了带有类型的函数指针的基本概念。

这里有一个使用Action和Func但不使用Linq的小例子:

class Program
{
    static void Main(string[] args)
    {
        Action myAction = new Action(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(123);
        Func myFunc = new Func(CalculateSomething);
        Console.WriteLine(myFunc(5));   // Prints out "2.5"
    }
    static void DoSomething(int i)
    {
        Console.WriteLine(i);
    }
    static double CalculateSomething(int i)
    {
        return (double)i/2;
    }
}

0
0 Comments

FuncAction之间的区别只是你是否想让委托返回一个值(使用Func)或不返回值(使用Action)。

Func 在 LINQ 中可能是最常用的 - 例如在投影中:

 list.Select(x => x.SomeProperty)

或者在过滤中:

 list.Where(x => x.SomeValue == someOtherValue)

或键选择中:

 list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)

Action 更常用于像 List.ForEach 这样的事情:为列表中的每个项目执行给定的操作。我使用这个的次数比Func少,尽管我有时会使用无参数版本(如Control.BeginInvokeDispatcher.BeginInvoke)。

Predicate 实际上只是一种特殊的Func ,在所有Func和大多数Action委托出现之前引入。我怀疑如果我们已经有这个Func和各种Action委托,那么就不会引入Predicate...尽管它确实赋予了委托使用的某种含义,而FuncAction用于广泛的不同目的。

PredicateList中主要用于像FindAllRemoveAll这样的方法。

0