扩展方法是否遵循C#中面向对象的范例?
使用扩展方法是一种好习惯吗?
在软件开发生命周期中,我们应该如何在设计阶段考虑这个问题?
答案 0 :(得分:9)
Eric Lippert blogged about this,我怀疑我做得比引用他好得多:
但是,我会补充一点,它们除了LINQ之外还有用 - 出于同样的原因,它们在 LINQ中是有用的。能够表达适用于特定接口的任意实现的算法(例如LINQ to Obhects中的所以,是的,经常听到的批评 “扩展方法不是 面向对象“完全正确, 但也无关紧要。延期 方法肯定不是 面向对象。他们把代码放了 它远远地操纵数据 从声明数据的代码, 他们不能打破封装和 与私人国家谈话 它们似乎是方法的对象, 他们不能很好地配合 继承,等等。他们是 程序式编程方便 面向对象的着装。
他们也非常方便 使LINQ成为可能,这就是我们的原因 添加它们。他们不这样做的事实 符合一些哲学理想 是什么使面向对象的语言 并不是真的很重要 那个决定。
IEnumerable<T>
)真的很棒。这些算法通常没有超出您正在处理的接口的任何上下文,因此它们通常是自然静态的。
如果你接受你有一些静态实用方法,你宁愿使用哪种语法?
// Traditional
CollectionUtils.Sort(collection);
// Extension methods
collection.Sort();
后者在我看来更具可读性。它简明扼要地表达了你想要做的事情。它没有说清楚你想要怎么做,但这对大多数当时不那么重要 - 而且当你调试那条特定的线时更重要的是,当然。
答案 1 :(得分:2)
它有两个部分。
使用时是否为OO 没有;它让你觉得你在特定类型上调用方法
OO是否基于编译/构建的方式
是;编译代码有一个静态方法,使用调用扩展方法的对象
答案 2 :(得分:1)
扩展方法不是面向对象的语言功能。 (与:类,继承,多态等相比)。
与每种语言功能一样,它应该在适当的地方使用,并且应该用于它的设计目的。关于何时以及如何使用扩展方法已经有很多问题。
答案 3 :(得分:0)
扩展方法只是一种语言功能。它们处理对象实例,是非常好的工具。
将它们视为扩展类功能的另一种方式。您可以向类添加新功能:
添加部分类声明。然后,该类立即获得一堆新的方法和属性。
通过在扩展方法持有者类中包含命名空间。然后,该类再次获得一堆新方法。
而是组织/语言功能。不以任何方式破坏面向对象的概念。正如C / C ++中的头/源文件划分与面向对象无关,只是语言/框架功能。
答案 4 :(得分:0)
这取决于。扩展方法只是一种工具。适当使用时它们非常有用。但如果你使用它们太多,它可能会掩盖你的代码。
答案 5 :(得分:0)
扩展方法只是与特定类或类层次结构一起使用的静态方法。 Python是OO但有模块,Ruby有mixins。我认为它更像是一种语言功能。我很确定它仍然是友好的