820

通过真实的例子及其使用,有人可以帮助我理解:

  1. 我们什么时候需要Func<T, ..>委托?
  2. 我们什么时候需要Action<T>委托?
  3. 我们什么时候需要Predicate<T>委托?
4

3 回答 3

1025

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<T>.ForEach:对列表中的每个项目执行给定的操作。我使用它的频率低于Func,尽管我有时会使用无参数版本来处理Control.BeginInvokeDispatcher.BeginInvoke

Predicate真的只是一个特例Func<T, bool>,在所有Func和大多数Action代表都来之前介绍过。我怀疑如果我们已经拥有FuncAction以各种形式出现,Predicate就不会被引入......尽管它确实赋予了委托的使用某种意义,而Func并且Action被用于广泛不同的目的。

Predicate主要用于和List<T>之类的方法。FindAllRemoveAll

于 2010-11-30T19:11:43.050 回答
428

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

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

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

尽管与 Linq 一起广泛使用,但 Action 和 Func 是逻辑上独立于 Linq 的概念。C++ 已经包含了类型化函数指针形式的基本概念。

这是一个不使用 Linq 的 Action 和 Func 的小例子:

class Program
{
    static void Main(string[] args)
    {
        Action<int> myAction = new Action<int>(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(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;
    }
}
于 2012-10-02T09:28:51.560 回答
67

Func - 当您想要一个可能接受或不接受参数并返回值的函数的委托时。最常见的例子是从 LINQ 中选择:

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

操作- 当您想要一个可能接受或不接受参数且不返回值的函数的委托时。我经常将这些用于匿名事件处理程序:

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

谓词- 当您想要一个专门版本的 Func 时,它根据一组标准评估一个值并返回一个布尔结果(匹配为 true,否则为 false)。同样,这些在 LINQ 中经常用于诸如 Where 之类的事情:

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

我只是仔细检查了一下,结果发现 LINQ 不使用谓词。不知道他们为什么做出这个决定......但从理论上讲,它仍然是 Predicate 适合的情况。

于 2010-11-30T19:13:50.840 回答