关于c#:Delegates:Predicate Action Func

Delegates: Predicate Action Func

能否有人对这三位最重要的代表作一个很好的解释(希望能举例说明):

  • 谓语
  • 行动
  • 芬克

C开发人员应该了解哪些其他代表?

在生产代码中使用它们的频率是多少?


  • Predicate:本质上是Func;提出问题"指定的参数是否满足委托所表示的条件?"用于list.findall等内容。

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

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

其他重要代表:

  • EventHandler/EventHandler:用于所有winforms

  • Comparison:和IComparer一样,但以代表的形式。


ActionFuncPredicate都属于代表家族。

Action:动作可以取n个输入参数,但返回void。

Func:func可以取n个输入参数,但总是返回所提供类型的结果。Func,这里T1、T2、T3是输入参数,tresult是它的输出。

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


除了乔恩的回答,还有

  • Converter:本质上是Func,但有语义。由list.convertall和array.convertall使用,但个人在其他任何地方都没有看到。

MethodInvoker是WinForms开发人员可以使用的工具;它不接受任何参数,也不返回任何结果。它早于操作,并且在调用到UI线程时仍然经常使用,因为begininvoke()等接受非类型化的委托;尽管操作也可以。

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

我还知道threadstart和参数化threadstart;同样,现在大多数人都会用一个动作来代替它。


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

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

func delegate-func delegate实例可以指向采用可变参数数并返回某种类型的方法。

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


带lambda的action和func:

1
2
3
4
5
6
7
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();


func对linq更友好,可以作为参数传入。(无点)

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

1
2
3
4
5
6
7
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