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

时间:2009-03-24 21:23:34

标签: c#-3.0 extension-methods

扩展方法对于他们所做的事情非常有趣,但我不觉得在课堂外创建“类成员”的想法是完全可以接受的。

我更愿意尽可能地避免这种做法,但有时使用扩展方法会更好。

您认为哪种情况是此功能的良好使用方法?

6 个答案:

答案 0 :(得分:2)

我认为扩展方法的最佳位置是“帮助”方法或“快捷方式”,通过为现有方法的参数提供默认值或隐藏方法调用的重复链,使现有API更容易和更清洁。

与您可以“扩展”您无法访问源代码的类的常见信念相反,您不能。您无法访问私有方法和对象,您可以做的就是抛光公共API并将其弯曲到您喜欢的位置(不推荐)。

答案 1 :(得分:2)

它们非常适合接口(您可以在其中添加仅使用接口上的现有方法的“复合”行为) - LINQ to Objects就是其中的主要示例。

它们对于创建流畅的接口也很有用,而不会影响正在使用的类型。我最喜欢的例子可能不适合生产代码,但对于单元测试很方便:

DateTime birthday = 19.June(1976) + 8.Hours();

基本上,在您不希望或不能向类型本身添加行为的任何地方,但是您希望更容易使用类型,扩展方法值得考虑。如果您发现自己编写了一堆静态方法来处理特定类型,请考虑扩展方法是否不会使对这些方法的调用看起来更好。

答案 2 :(得分:1)

当类不可扩展且您无法控制源代码时。或者,如果它是可扩展的,但您更喜欢能够使用现有类型而不是您自己的类型。如果扩展名没有改变类的字符,只会提供(IMO)缺少的功能,我只会做后者。

答案 3 :(得分:1)

在我看来,扩展方法对于增强代码的可读性和可维护性非常有用。对于您无法访问原始类的实体,或者该方法违反原始类的“单一责任原则”的实体,它们似乎是最佳的。我们这里的后者的一个例子是DSL。使用扩展方法扩展DSL模型以使T4模板更容易,但除非模型与模型特别相关,否则不会添加任何方法。

答案 4 :(得分:1)

它们的理想用途是当你有一个可以在很多地方实现的接口时,所以你不想给实现者带来巨大的负担,但是你希望从调用者的角度来看这个接口很方便使用同样。

因此,您将“帮助者”放入一组扩展方法中,使界面本身变得美观和精益。

interface IZoomable
{
    double ZoomLevel { get; set; }
}

public static void SetDefaultZoom(this IZoomable z)
{
    z.ZoomLevel = 100;
}

答案 5 :(得分:0)

扩展方法是一种很好的方法,可以为您不拥有的类(无源代码)添加功能,在框架中或您不希望因任何原因继承的类。

我喜欢他们,但你是对的。应该明智地使用它们。