(Func,Action,Predicate)VS转换器和比较委托c#

时间:2017-08-01 07:28:11

标签: c# delegates

我了解Func,Action,Predicate,借助本网站提供的一些精彩帖子,简而言之 -

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

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

Predicate是一种特殊的Func,通常用于比较。

现在我对ConverterComparison委托感到困惑,为什么.Net Framework引入了这两种代表风格,仅用于转换和比较,何时以及如何在现有3上使用这两种代码。

请提供更简单,更简短的理解示例。

1 个答案:

答案 0 :(得分:6)

  

现在我对转换器和比较委托感到困惑,为什么.Net Framework引入了这两种代表风格,仅用于转换和比较,何时以及如何在现有3上使用这两种代码。

从历史上看,代表的顺序与你的问题所暗示的顺序相反。

.NET 2.0中引入了

Predicate<T>Converter<TInput, TOutput>Comparison<T>。它们被List<T>和其他一些类型使用。此时C#不支持lambda表达式,但 支持匿名方法。代表们主要用于事件处理和启动线程...支持谓词,转换和比较是有效的一步。

请注意,Predicate<T>不用于比较 - 它用于测试单个值。例如,您可以使用Predicate<string>表示“字符串长度是否超过5个字符?” Comparison<T>但是, 用于比较值 - 它用于排序。

使用LINQ,FuncAction代表(主要是 - Action<T>在.NET 2.0中;由List<T>.ForEach使用)在.NET 3.5中引入。这是C#3引入lambda表达式及其LINQ支持的时间框架,突然间代理人随处可见。我相信代表的意识水平(以及如何使用它们)会随着C#3大量

LINQ的早期预发布使用Predicate<T>而不是Func<T, bool>,但随后引入了Where的其他重载,接受Func<T, int, bool>以允许索引成为谓词。

怀疑如果框架是从头开始重新设计的,那么“特殊用途”代表(Predicate<T>Converter<TInput, TOutput>Comparison<T>)可能不存在。 Predicate<T>Comparison<T>可能仍然存在,因为它们提供了关于委托的目的的额外语义提示,这有助于提高可读性 - 但Converter<TInput, TOutput>实际上没有任何好处Func<T, TResult>