CSharp - Func vs. Action vs. Predicate

  显示原文与译文双语对照的内容

这个问题已经有了如下答案:

使用真实的示例和它们的用法,有人可以帮助我理解:

  1. 什么时候需要Func委托?
  2. 什么时候需要操作委托?
  3. 什么时候需要谓词委托?
时间:

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<T>.ForEach: 为 List 中的每一项执行给定的操作。 于诸如 Control.BeginInvoke 和我使用这里 Func 次数就会降低相关,虽然我做有时使用无参数老汇

Predicate 只是一个特殊的封装 Func<T, bool>,在所有 Func 和大多数 Action 代理出现之前引入。 我怀疑如果我们已经有了 FuncAction 以不同的伪装,Predicate 将不会被引入。。 于广泛分散的purposes,相关虽然它只供委托,而 Func 齿间吻合确实一定意义和 Action 把降维后

PredicateList<T> 中主要用于 FindAllRemoveAll 之类的方法。

动作是委托( 指针) 到方法的委托,它接受零,一个或者多个输入参数,但不返回任何内容。

函数是一个委托( 指针) 到方法的委托,它接受零,一个或者多个输入参数,并返回一个值( 或者引用) 。

谓词是一种特殊的函数,常用作比较。

尽管广泛地使用了 Linq,Action和Func在逻辑上与Linq无关。 C++ 已经以类型化函数指针形式包含基本概念。

下面是一个不使用Linq的操作和功能的小示例:


class Program
{
 static void Main(string[] args)
 {
 Action<int> myAction = new Action<int>(DoSomething);
 myAction.Invoke(123);//Prints out"123"

 Func<int, double> myFunc = new Func<int, double>(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;
 }
}

函数 - 当你需要一个函数的委托,该函数可能带有参数并返回一个值。 最常见的示例是从 LINQ:


var result = someCollection.Select( x => new { x.Name, x.Address });

动作 - 当你需要一个函数的委托,该函数可能带有参数并且不返回值时。 我经常使用这些匿名事件处理程序:


button1.Click += (sender, e) => {/* Do Some Work */}

谓词 - 当你需要一个特殊版本的Func,它根据一组条件计算值并返回一个布尔值结果( 对于匹配,为真,否则为假) 。 同样,这些在LINQ中经常使用,比如:


var filteredResults = 
 someCollection.Where(x => x.someCriteriaHolder == someCriteria);

我只是检查了一下,结果是LINQ不使用谓词。 不知道为什么他们做了这个决定- - 但理论上它仍然是与一个谓词能填满。

...