扩展方法对于他们所做的事情非常有趣,但我不觉得在课堂外创建“类成员”的想法是完全可以接受的。
我更愿意尽可能地避免这种做法,但有时使用扩展方法会更好。
您认为哪种情况是此功能的良好使用方法?
答案 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)
扩展方法是一种很好的方法,可以为您不拥有的类(无源代码)添加功能,在框架中或您不希望因任何原因继承的类。
我喜欢他们,但你是对的。应该明智地使用它们。