在.Net中使用扩展方法的最佳实践是什么?

43

我看到这些被用在各种场合,并被指责使用它们的方式不正确(尽管在那种情况下,我是以演示一个 观点 的方式使用它们的)。

那么,你认为使用扩展方法的最佳实践是什么?

开发团队应该创建一个扩展方法库并在各个项目中部署它们吗?

是否应该有一组通用的扩展方法,以开源项目的形式存在?

更新:已经决定创建一个全局的扩展方法库。

6个回答

7
即将发布的《框架设计指南第二版》将提供有关实现扩展方法的一些指导,但总的来说:
您应该仅在“语义上有意义”并且提供与每个实现相关的帮助功能时定义扩展方法。
您还应避免扩展System.Object,因为并非所有的.NET语言都能够将扩展方法作为扩展调用。(例如,VB.NET需要将它作为静态扩展类上的常规静态方法进行调用。)
除非您要扩展一个接口,否则不要在扩展类型的相同命名空间中定义扩展方法。
不要使用与“真实”方法相同的签名来定义扩展方法,因为它永远不会被调用。

4

1
注意到这两个参考项目似乎自2008年以来没有任何进一步的开发活动。 - DavidRR

3

我一直把我的扩展方法包含在 Utils 类中,与我的核心库一起使用,因为使用我的框架的人可能会发现这些方法很有用,但是对于大规模部署,最终开发人员可能会有多个扩展方法库可供选择,我建议将所有扩展方法放到它们自己的命名空间中,甚至它们自己的项目文件中,这样人们就可以选择添加引用或 using 语句或者只是在必要时使用,如下所示:

Core.Extensions.Base64Encode(str);

我的Utils类是我最好的朋友,在扩展方法出现之前,它就已经存在了,而且扩展方法只是加强了我们的关系。我遵循的最重要的规则是尽可能让人们选择他们正在使用的扩展框架。


3

自20世纪90年代初以来,Objective-C语言就拥有“类别(Categories)”;这本质上与.NET扩展方法相同。在寻找最佳实践时,您可能希望查看Objective-C(Cocoa和NeXT)开发人员在此方面制定的经验法则。

Brent Simmons(Mac OS X和iPhone的NetNewsWire RSS阅读器的作者)今天刚刚发布了他的新样式规则,用于使用类别,在Cocoa社区中已经出现了一些讨论


2
当我第一次了解扩展方法时,我确实滥用它们。
基本上,出于许多原因,我已经开始避免使用任何扩展方法。
我停止使用它们的一些原因在Scott的博客链接中有所提及,例如“在扩展您不拥有的类型之前三思”。如果您无法控制要扩展的类型的源代码,那么如果源类型进行了一些添加/更改,例如将项目移动到新的.NET版本,您可能会在未来遇到问题/冲突。如果新的.NET版本包含与您的扩展同名的类型方法,某人将会被覆盖。
我停止使用扩展方法的主要原因是,您无法从阅读代码中快速确定方法的来源和“所有者”。
当仅仅阅读代码时,您无法确定该方法是否是一个扩展方法,还是类型的标准NET API方法。
Intellisense菜单可能会变得非常混乱。

2

我认为这取决于Extension方法的目的。

  • 与项目特定业务需求相关的Extension方法(无论是与基本数据类型还是自定义对象相关)不应包含在分布在多个项目之间的库中。
  • 与基本数据类型(int,string等)或具有更广泛应用的泛型相关的Extension方法可以打包并分发到各个项目中。

注意不要全局包含几乎没有应用的Extension方法,因为它们只会堵塞智能提示,可能会导致混淆和/或误用。


嗯,没错。那是对的。但是是否应该有更具体的指南呢?(例如,是否应该扩展对象类?)您应该扩展第三方库吗? - Vaibhav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接