【问题标题】:(Func, Action, Predicate) VS Converter and Comparison delegate c#(Func, Action, Predicate) VS 转换器和比较委托 c#
【发布时间】:2017-08-01 07:28:10
【问题描述】:

借助本网站上的一些精彩帖子,我理解了 Func、Action、Predicate -

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

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

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

现在我对 ConverterComparison 委托感到困惑,为什么 .Net Framework 引入这 2 种委托风格只是为了转换和比较,何时以及如何使用这 2 种而不是现有的 3 种。

请提供更简单、更简短的例子以便理解。

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    现在我对转换器和比较委托感到困惑,为什么 .Net Framework 引入这两种委托风格只是为了转换和比较,何时以及如何使用这两种委托而不是现有的 3。

    从历史上看,代表的介绍顺序与您的问题建议的顺序相反。

    Predicate<T>Converter<TInput, TOutput>Comparison<T> 是在 .NET 2.0 中引入的。 List<T> 和其他一些类型使用它们。此时 C# 不支持 lambda 表达式,但 确实 支持匿名方法。委托主要用于事件处理和启动线程...支持它们进行谓词、转换和比较是一个有效的步骤。

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

    FuncAction 代表(大部分 - 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> 有任何好处。

    【讨论】:

    • 能否请您编辑答案并提供一些 sn-p 以了解如何使用这两种新类型。
    • @LogicalDesk:您认为哪些类型是“新的”? (所描述的所有类型已经存在了近 10 年......)
    • 我不知道比较和转换器这就是为什么我说它们是新的,抱歉。
    • @LogicalDesk:那么请仔细阅读我的回答——这里的历史matters。您在问为什么在 Y 已经可以处理所有事情时才引入 X - 当您知道 X 排在第一位时,这没有多大意义。
    • 你是传奇@Jon,我看过你的书,它们也和你一样令人惊叹。
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2011-05-27
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多