【问题标题】:why extension methods in C# Class Libraries为什么 C# 类库中的扩展方法
【发布时间】:2012-02-01 10:04:57
【问题描述】:

我确实经历了一些MSDN documentations。我发现那里也记录了扩展方法。

我不明白,为什么这些基类库有扩展方法?什么时候可以将它们添加到特定的类库本身?

有什么好处?区别?

【问题讨论】:

    标签: c# extension-methods class-library


    【解决方案1】:

    顾名思义,扩展方法扩展了目标类型的功能或可用性。

    1. 这些方法可以在类型已经发布之后(在类型创作时间之后)添加。
    2. 它们可以由不同的人编写
    3. 扩展方法可以针对接口。 (替代方案是拥有一个具有这些方法的通用基本类型,或者在每种类型中重新实现它们)
    4. 不同的人可以根据自己的需要对同一类型进行不同的扩展。

    正确使用扩展方法可以消除实际类型定义/实现中的正交混乱(而不是在类型定义中关注类型的核心功能)。

    以 LINQ 为例 - 通过为IEnumerable 提供扩展方法,它可以针对大量已发布的类型(以及未来可能编写的大量类型);它分离了正交关注点,例如从实际类型中查询类型。

    【讨论】:

    • 您列表中的第 3 项是完全错误的。它完全歪曲了您的“替代方案”中描述的扩展方法的机制。另外,“从实际类型中查询类型”是什么意思?
    • @A.R.,也许你需要解释一下#3 中的 是什么。 #3 的好例子是IEnumerable<T> - 如果接口不能被扩展方法作为目标,那么一些主体将不得不为所有这些方法以特定类型(或它们的公共基类型)编写实现。
    • @AR,此外,我在IEnumerable 的上下文中使用了术语“正交关注点,例如从实际类型中查询类型” - 它仅表示不同的集合,例如字典,列表、queue、set、stack等不必为各种查询方法(join、count、first、last等)提供实现。这个逻辑真的不是这些类的核心关注点。
    • 实际的替代方法是编写一个静态方法,该方法将 'IEnumeralbe' 实例作为参数。这正是扩展方法在编译时所做的。建议某些“基类”必须“重新实现”相当于辅助函数的功能既荒谬又具有危险的误导性。以扩展方法“Max”为例,并在您建议的“替代”中使用它。我究竟需要在什么时候重新实现它?
    • 关于 LINQ 的最后一点,以及对它的解释毫无意义。您是在建议扩展方法在这些集合类型上“提供实现”,而这不是扩展方法的作用。
    【解决方案2】:

    记录的扩展方法在IEnumerable<T> 上定义,ObjectSet<T> 实现了这些方法。

    它们已记录在案,因此您知道可以使用它们。

    作为扩展方法,它们最终会免费扩展实现此接口的任何类型。

    【讨论】:

      【解决方案3】:

      请注意,这些方法中的许多都在接口上运行,这是使用扩展方法的一个完全正当的借口,即使对于微软来说也是如此,因为接口本身不能有任何方法的实现。

      【讨论】:

        【解决方案4】:

        我认为这很可能是“营销问题”。建议BCL消费者(我们)在我们需要的地方使用扩展方法的方法。

        从可用性的角度来看,没有任何好处,imo,将它们集成到 BCL

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-15
          相关资源
          最近更新 更多