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

Translate

我已经看到这些方式的用法各有不同,并且被指控以错误的方式使用它们(尽管在这种情况下,我正在以这种方式使用它们来展示).

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

开发团队是否应该创建扩展方法库并将其部署到各个项目中?

是否应该以开源项目的形式收集一些通用的扩展方法?

更新:已决定创建组织范围的扩展方法库

This question and all comments follow the "Attribution Required."

所有的回答

Translate

即将发布的第二版《框架设计指南》将为实现扩展方法提供一些指导,但通常:

您只应在“有意义的地方”定义扩展方法,并提供与每个实现相关的辅助功能。

您还应该避免扩展System.Object,因为并非所有.NET语言都可以将扩展方法作为扩展调用。 (例如,VB.NET将需要作为静态扩展类上的常规静态方法来调用它。)

除非要扩展接口,否则请不要在与扩展类型相同的名称空间中定义扩展方法。

不要定义与“真实”方法具有相同签名的扩展方法,因为它永远不会被调用。

来源
Translate

你可能想看看http://www.codeplex.com/nxlhttp://www.codeplex.com/umbrella都是扩展方法库。我个人没有看过源代码,但是我敢肯定那里的人能够为您提供一些很好的指导。

来源
Translate

我一直将扩展方法包含在Utils类的Core库中,因为使用我的框架的人们可能会发现有用的方法,但是对于大规模部署,最终开发人员可以选择扩展方法库,我建议将所有扩展名放入自己的名称空间,甚至自己的项目文件中,以便人们可以选择添加引用或using语句,或仅在需要时添加,例如:

Core.Extensions.Base64Encode(str);

我的Utils课是我在全世界最好的朋友,那是在扩展方法问世之前,它们只有助于加强我们的关系。我要遵循的最大原则是让人们在可能的情况下选择使用哪种扩展框架。

来源
Translate

自1990年代初期以来,Objective-C语言就拥有“类别”;这些本质上与.NET扩展方法相同。当寻找最佳实践时,您可能想看看Objective-C(Cocoa&NeXT)开发人员提出了哪些经验法则。

布伦特·西蒙斯(Brent Simmons)(适用于Mac OS X和iPhone的NetNewsWire RSS阅读器的作者)今天发表了关于他的使用类别的新样式规则而且有一些可可社区中的讨论在那个帖子周围。

来源
Translate

我认为这取决于扩展方法的用途。

  • 与项目的特定业务需求相关的扩展方法(无论它们是否连接到基本数据类型或自定义对象)都不应包含在将在多个项目中分布的库中。
  • 与基本数据类型(int,字符串等)或具有更广泛应用的泛型相关的扩展方法可以打包并分布在各个项目中。

注意不要在全局范围内使用几乎没有应用的扩展方法,因为它们只会阻塞智能感知,并可能导致混乱和/或误用。

来源
Translate

当我第一次发现扩展时,我真的过度使用和滥用它们。

在大多数情况下,由于多种原因,我已经开始摆脱使用任何扩展方法的麻烦。

我在上面的Scott博客链接中指出了我停止使用它们的一些原因,例如“在扩展您不拥有的类型之前请三思”。如果您无法控制要扩展的类型的源,那么如果源类型具有一些附加功能/更改,例如将项目移至新的.NET版本,则将来可能会遇到问题/冲突。如果较新的.NET版本包含与扩展名相同类型的方法,则可能会让人someone目结舌。

我停止使用扩展方法的主要原因是,您无法通过阅读代码快速分辨出该方法的来源和“拥有”的人。

仅阅读代码时,您无法确定该方法是扩展名还是该类型上的标准NET API方法。

智能菜单可以很快变得非常混乱。

来源