扩展方法是C#的面向对象特性吗?

扩展方法是否遵循C#中面向对象的范例?

使用扩展方法是一种好习惯吗?

在软件开发生命周期中,我们应该如何在设计阶段考虑这个问题?

扩展方法不是面向对象的语言function。 (比较:类,inheritance,多态等)。

与每种语言function一样,它应该在适当的地方使用,并且应该用于它的设计目的。 关于何时以及如何使用Extension方法已经有很多问题。

  • 在.Net中使用扩展方法的最佳实践是什么?
  • 扩展方法的可能过度使用
  • 扩展方法是否隐藏依赖关系?

埃里克·利珀特(Eric Lippert)在博客中发表了这篇文章 ,我怀疑自己做得比引用他要好得多:

所以,是的,经常听到的批评“扩展方法不是面向对象”是完全正确的,但也是无关紧要的。 扩展方法当然不是面向对象的。 他们将操纵数据的代码放在远离声明数据的代码的位置,它们不能破坏封装并与它们看起来是方法的对象的私有状态对话,它们不能很好地inheritance,等等。 它们是一种方便的面向对象服装的程序编程。

它们也非常方便,使LINQ成为可能,这就是我们添加它们的原因。 事实上,他们不符合某种forms的面向对象语言的哲学理想并不是这个决定的重要因素。

但是,我会补充一点,它们除了LINQ之外还有用 – 因为它们 LINQ中很有 。 能够表达适用于特定接口的任意实现的算法(例如LINQ to Obhects中的IEnumerable )真的很棒。 这些算法通常没有超出您正在处理的接口的任何上下文,因此它们通常是自然静态的。

如果你接受你有一些静态实用方法,你会使用哪种语法?

 // Traditional CollectionUtils.Sort(collection); // Extension methods collection.Sort(); 

在我看来,后者更具可读性。 它简明扼要地表达了你想要做的事情。 它并不清楚你想怎么做,但这在大多数时候都不那么重要 – 当然,当你调试那条特定的线时更重要。

它有两个部分。

  1. 当我们使用它时它是OO吗? 它会让你觉得你在特定类型上调用方法

  2. 它是基于如何编译/构建的OO

是; 编译代码有一个静态方法,使用调用扩展方法的对象

扩展方法只是一种语言function。 他们在对象实例上工作,是非常好的工具。

将它们视为扩展类function的不同方式。 您可以向类添加新function:

  • 通过添加部分类声明。 然后,该类立即获得一堆新的方法和属性。

  • 通过在扩展方法持有者类中包含命名空间。 然后,该类再次获得一堆新方法。

而是组织/语言function。 不以任何方式破坏面向对象的概念。 正如C / C ++中的头/源文件划分与面向对象无关,只是语言/框架function。

这取决于。 扩展方法只是一种工具。 如果使用得当,它们非常有用。 但是如果你使用它们太多,它可能会掩盖你的代码。

扩展方法只是与特定类或类层次结构一起使用的静态方法。 Python是OO但有模块,Ruby有mixins。 我认为它更像是一种语言function。 我很确定它仍然是OO友好的