Func和Action和Predicate之间的区别[duplicate]
Func和Action和Predicate之间的区别[duplicate]
此问题已经有了答案:
请问能否给出具体例子,帮助我理解以下内容:
- 我们何时需要使用
Func<T, ..>
代理? - 我们何时需要使用
Action
代理? - 我们何时需要使用
Predicate
代理?
admin 更改状态以发布 2023年5月23日
Action是一个委托(指针),它可以指向一个方法,该方法可以带零个、一个或多个输入参数,但不返回任何内容。
Func是一个委托(指针),它可以指向一个方法,该方法可以带零个、一个或多个输入参数,并返回一个值(或引用)。
Predicate是一种特殊的Func,通常用于比较(带有一个泛型参数并返回bool类型)。
尽管在Linq中被广泛使用,但Action和Func是与Linq逻辑上独立的概念。C++已经包含了带有类型的函数指针的基本概念。
这里有一个使用Action和Func但不使用Linq的小例子:
class Program { static void Main(string[] args) { ActionmyAction = 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; } }
在Func
和Action
之间的区别只是你是否想让委托返回一个值(使用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
这样的事情:为列表中的每个项目执行给定的操作。我使用这个的次数比Func
少,尽管我有时会使用无参数版本(如Control.BeginInvoke
和Dispatcher.BeginInvoke
)。
Predicate
实际上只是一种特殊的Func
,在所有Func
和大多数Action
委托出现之前引入。我怀疑如果我们已经有这个Func
和各种Action
委托,那么就不会引入Predicate
...尽管它确实赋予了委托使用的某种含义,而Func
和Action
用于广泛的不同目的。
Predicate
在List
中主要用于像FindAll
和RemoveAll
这样的方法。