c#扩展方法-设计模式

c#扩展方法-设计模式,c#,design-patterns,extension-methods,C#,Design Patterns,Extension Methods,我想知道C#扩展方法是否基于任何现有的设计模式。否。它只是一种语言功能。当然,如果您想要实现某些设计模式,您可以使用C#扩展方法。例如,在C#中模拟mixin。我不会将扩展方法标记为任何常见的设计模式,但它可以用于实现诸如装饰器和适配器等模式。它们不是基于现有的设计模式。当这个“功能”首次在Delphi中引入时,Borland甚至以这个名字警告用户远离他们,但现在尘埃落定,他们找到了属于自己的地方 像其他东西一样,在适当的时候使用 不,它们不是,因为它们只是语法上的糖分。设计模式只是一个众所周知

我想知道C#扩展方法是否基于任何现有的设计模式。

否。它只是一种语言功能。

当然,如果您想要实现某些设计模式,您可以使用C#扩展方法。例如,在C#中模拟mixin。

我不会将扩展方法标记为任何常见的设计模式,但它可以用于实现诸如装饰器和适配器等模式。

它们不是基于现有的设计模式。当这个“功能”首次在Delphi中引入时,Borland甚至以这个名字警告用户远离他们,但现在尘埃落定,他们找到了属于自己的地方


像其他东西一样,在适当的时候使用

不,它们不是,因为它们只是语法上的糖分。

设计模式只是一个众所周知的范例,即“当你想要实现X时,就做Y”。在面向对象语言(如C#)中,一个众所周知的范例是“当你想对一个对象的状态进行操作时,对它的实例调用一个方法”

但是,在创建扩展方法之前,您不能对无法向其添加实现的对象的实例调用自己的方法(例如,接口,因为它们不能有实现,或者库类,因为它们已经编译)。扩展方法通过允许您在对象实现外部定义的同时,使方法看起来可以在对象实例上调用来填补这一空白


是的,可以说扩展方法是基于这种非常简单的设计模式,使作用于对象状态的方法看起来可以从对象的实例调用。

扩展方法可以被认为是对象的替代方法。也有人建议,它们可以用作


一般来说,语言的发展使得设计模式的需求变得不那么必要。例如,有一句话说Lisp不需要设计模式,因为所有东西都是用这种语言构建的。因此,正确的问题是,扩展方法取代了什么设计模式?

最接近的规范设计模式可能是。

否,但扩展方法对于实现某些GoF设计模式(例如原型)是非常好的。

与扩展方法最匹配的设计模式是外观模式。 我的理由是:我们通常使用扩展方法不是为了引入目标类职责之外的新功能,而是为了简化现有目标类的使用。 因为简化目标类的使用是Facade模式关注的问题,所以扩展方法也可以使用Facade模式来实现。 在扩展和单元测试扩展方法中存在一些问题。因此,我认为实现Facade模式是一种比使用扩展方法更好的方法。
但是,可以实现一些封装facade接口的扩展方法,以便为客户端代码提供编码功能。

不要过度使用扩展方法,请参阅Eric Lipperts博客“foreach V’s foreach”中的这篇文章严格来说,扩展方法是不可行的。但是你能够用与实例方法相同的语法调用它们。如果你不相信我,你可以简单地在谷歌上找到这句话:“扩展方法是语法糖”,你可以找到数百个链接来证明我的观点。Rune,没有这个能力,扩展方法只是常规的静态方法。“您能够使用与实例方法相同的语法调用它们”是扩展方法的唯一特性,正如您自己所说,这个特性是语法糖。如果我想自己实现一个扩展,那么扩展的“酸”语法是什么呢?更准确地说,(好)语言趋向于进化以简化流行设计模式的使用。还要注意的是,你永远都离不开使用设计模式,每一种设计都是某种设计模式,设计模式的语言只是一种形式化这一想法的方式,并促进使用某些已知和测试的模式(就像拱门或扶壁是建筑中一种已知的设计模式一样).两者都可以。例如,委托是一种C#语言功能,可以启用发布者-订阅者模式。您能否详细说明您的答案以解释原因?它不是类似于装饰者模式,但具有不同的结构吗?