我了解Func,Action,Predicate,借助本网站提供的一些精彩帖子,简而言之 -
Action
是方法的委托(指针),它接受零个,一个或多个输入参数,但不返回任何内容。
Func
是方法的委托(指针),它接受零个,一个或多个输入参数,并返回一个值(或引用)。
Predicate
是一种特殊的Func
,通常用于比较。
现在我对Converter
和Comparison
委托感到困惑,为什么.Net Framework引入了这两种代表风格,仅用于转换和比较,何时以及如何在现有3上使用这两种代码。
请提供更简单,更简短的理解示例。
答案 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,Func
和Action
代表(主要是 - 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>
。