代表:谓语vs.动作vs.功能


137

有人可以对这3个最重要的代表提供很好的解释(希望有例子):

  • 谓词
  • 行动
  • 功能

Answers:


180
  • Predicate:本质上Func<T, bool>; 提出问题“指定的参数是否满足委托代表的条件?” 用于List.FindAll之类的东西。

  • Action:执行给定参数的操作。非常通用。基本上,它在LINQ中使用不多,因为它暗示了副作用。

  • Func:在LINQ中广泛使用,通常用于转换参数,例如通过将复杂结构投影到一个属性。

其他重要代表:

  • EventHandler/ EventHandler<T>:在整个WinForms中使用

  • Comparison<T>:喜欢,IComparer<T>但采用代理人形式。


3
还有System.Converter<TInput, TOutput>,虽然很少使用。
G-Wiz 2010年

4
该转换器时,需要大量的模型转换成业务类别的一个很好的代表,即stum.de/2009/12/23/...
迈克尔葡萄汁

EventHandler/EventHandler<T>也出现在WinForms之外。
安迪

@Andy:有点...但是例如在WPF中就少了。我同意没有特定于WinForms的东西。
乔恩·斯基特

48

ActionFunc并且Predicate都属于代表家庭。

Action :操作可以接受n个输入参数,但返回void。

Func:Func可以接受n个输入参数,但始终会返回所提供类型的结果。Func<T1,T2,T3,TResult>,这里T1,T2,T3是输入参数,TResult是它的输出。

Predicate:谓词也是Func的一种形式,但它始终会返回bool。简单来说,它是的包装Func<T,bool>


关于这个问题,我找到了最佳和最简单的答案
Reyan Chougle,

@ReyanChougle:很高兴,您发现它很有帮助。
Rahul Garg 19'Sep

9

除了乔恩的答案,还有

  • Converter<TInput, TOutput>:本质上是Func<TInput, TOutput>,但是具有语义。由List.ConvertAll和Array.ConvertAll使用,但个人在其他任何地方都没有看到它。

4

MethodInvoker是WinForms开发人员可以使用的一种方法。它不接受任何参数,也不返回任何结果。它早于Action,并且在调用UI线程时仍经常使用,因为BeginInvoke()等人接受未类型的Delegate;尽管动作也一样。

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

我也会知道ThreadStart和ParameterizedThreadStart;如今,大多数人会再次用Action代替。


3

谓词,Func和Action是.NET的内置委托实例。这些委托实例中的每一个都可以引用或指向具有特定签名的用户方法。

动作委托-动作委托实例可以指向带有参数并返回void的方法。

Func委托-Func委托实例可以指向采用可变数量的参数并返回某种类型的方法。

谓词-谓词类似于func委托实例,它们可以指向采用可变数量的参数并返回布尔类型的方法。


2

带lambda的Action和Func:

person p = new person();
Action<int, int> mydel = p.add;       /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1=  mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();

2

Func对LINQ更友好,可以作为参数传递。(无积分)

谓词不能,必须重新包装。

Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;

new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again

new []{2,-4}.Where(IsPositivePred);  //Compile Error
new []{2,-4}.Where(IsPositiveFunc);  //Func as Parameter

2

一个简单的例子,关于参数以及每种类型的含义

该Func接受两个int参数并返回一个int.Func始终具有返回类型

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

在这种情况下,func没有参数,但是返回一个字符串

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

该操作采用两个int参数,并返回void

Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6

该谓词采用一个参数并始终返回布尔值。通常,谓词始终返回bool。

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.