代表:Predicate Action Func

时间:2009-02-19 19:49:02

标签: c# delegates

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

  • 谓词
  • 动作
  • 函数功能

C#开发人员应该注意哪些其他代表?

您多久在生产代码中使用它们?

8 个答案:

答案 0 :(得分:175)

  • Predicate:基本上Func<T, bool>;问一个问题“指定的参数是否满足委托所代表的条件?”用于像List.FindAll。

  • 这样的东西
  • Action:根据参数执行操作。非常通用。在LINQ中使用不多,因为它基本上意味着副作用。

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

其他重要代表:

  • EventHandler / EventHandler<T>:在WinForms上使用

  • Comparison<T>:与IComparer<T>类似,但代表形式。

答案 1 :(得分:34)

ActionFuncPredicate都属于代表家庭。

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

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

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

答案 2 :(得分:9)

除了Jon的回答,还有

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

答案 3 :(得分:4)

MethodInvoker是WinForms开发人员可以使用的;它不接受任何参数并且不返回任何结果。它早于Action,并且在调用UI线程时仍然经常使用,因为BeginInvoke()等接受一个无类型的Delegate;虽然行动也会做得很好。

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

我也知道ThreadStart和ParameterizedThreadStart;这些天大多数人都会替换一个行动。

答案 4 :(得分:3)

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

Action委托 - Action委托实例可以指向接受参数并返回void的方法。

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

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

答案 5 :(得分: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();

答案 6 :(得分:1)

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

答案 7 :(得分:0)

一个简单的示例,说明参数和每种类型的含义

此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。通常,谓词始终返回bool。

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True