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

时间:2009-11-26 08:51:14

标签: c# .net asp.net

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

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

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

6 个答案:

答案 0 :(得分:9)

Eric Lippert blogged about this,我怀疑我做得比引用他好得多:

  

所以,是的,经常听到的批评   “扩展方法不是   面向对象“完全正确,   但也无关紧要。延期   方法肯定不是   面向对象。他们把代码放了   它远远地操纵数据   从声明数据的代码,   他们不能打破封装和   与私人国家谈话   它们似乎是方法的对象,   他们不能很好地配合   继承,等等。他们是   程序式编程方便   面向对象的着装。

     

他们也非常方便   使LINQ成为可能,这就是我们的原因   添加它们。他们不这样做的事实   符合一些哲学理想   是什么使面向对象的语言   并不是真的很重要   那个决定。

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

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

// Traditional
CollectionUtils.Sort(collection);

// Extension methods
collection.Sort();

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

答案 1 :(得分:2)

它有两个部分。

  1. 使用时是否为OO 没有;它让你觉得你在特定类型上调用方法

  2. OO是否基于编译/构建的方式

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

答案 2 :(得分:1)

扩展方法不是面向对象的语言功能。 (与:类,继承,多态等相比)。

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

答案 3 :(得分:0)

扩展方法只是一种语言功能。它们处理对象实例,是非常好的工具。

将它们视为扩展类功能的另一种方式。您可以向类添加新功能:

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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