现在我对转换器和比较委托感到困惑,为什么 .Net Framework 引入这两种委托风格只是为了转换和比较,何时以及如何使用这两种委托而不是现有的 3。
从历史上看,代表的介绍顺序与您的问题建议的顺序相反。
Predicate<T>、Converter<TInput, TOutput> 和 Comparison<T> 是在 .NET 2.0 中引入的。 List<T> 和其他一些类型使用它们。此时 C# 不支持 lambda 表达式,但 确实 支持匿名方法。委托主要用于事件处理和启动线程...支持它们进行谓词、转换和比较是一个有效的步骤。
请注意,Predicate<T> 不用于比较 - 它用于测试单个值。例如,您可以使用 Predicate<string> 表示“字符串长度是否超过 5 个字符?” Comparison<T>,然而,是用于比较值 - 它用于排序。
Func 和 Action 代表(大部分 - Action<T> 在 .NET 2.0 中;由 List<T>.ForEach 使用)在 .NET 3.5 中通过 LINQ 引入。那是 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> 有任何好处。