通过真实的例子及其使用,有人能帮助我理解吗
我们什么时候需要Func<T,..>代表我们什么时候需要行动<T>代表?何时需要谓词<T>委托?
通过真实的例子及其使用,有人能帮助我理解吗
我们什么时候需要Func<T,..>代表我们什么时候需要行动<T>代表?何时需要谓词<T>委托?
当前回答
Action是一个方法的委托(指针),它接受零个、一个或多个输入参数,但不返回任何内容。
Func是一个方法的委托(指针),它接受零个、一个或多个输入参数,并返回一个值(或引用)。
谓词是一种特殊的Func,通常用于比较(采用泛型参数并返回布尔值)。
虽然与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;
}
}
其他回答
Action是一个方法的委托(指针),它接受零个、一个或多个输入参数,但不返回任何内容。
Func是一个方法的委托(指针),它接受零个、一个或多个输入参数,并返回一个值(或引用)。
谓词是一种特殊的Func,通常用于比较(采用泛型参数并返回布尔值)。
虽然与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;
}
}
Func-当您需要一个可以接受或不接受参数并返回值的函数的委托时。最常见的例子是从LINQ中选择:
var result = someCollection.Select( x => new { x.Name, x.Address });
操作-当您需要一个可以接受或不接受参数且不返回值的函数的委托时。我经常将这些用于匿名事件处理程序:
button1.Click += (sender, e) => { /* Do Some Work */ }
谓词-当您需要一个专门版本的Func,它根据一组条件计算值并返回布尔结果(匹配为true,否则为false)。同样,这些在LINQ中经常用于以下情况:
var filteredResults =
someCollection.Where(x => x.someCriteriaHolder == someCriteria);
我只是仔细检查了一下,结果发现LINQ不使用谓词。不知道他们为什么做出这个决定。。。但从理论上讲,它仍然是一种适合谓词的情况。
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.BeginInvoke和Dispatcher.BeginInvoke等对象使用无参数版本。
谓词实际上只是一个特殊大小写的Func<T,bool>,在所有Func和大多数Action代理出现之前就已经引入。我怀疑,如果我们已经有了各种形式的Func和Action,Predicate就不会被引入。。。尽管它确实赋予了委托的使用某种意义,但Func和Action用于广泛不同的目的。
谓词主要用于List<T>中的FindAll和RemoveAll等方法。