我见过它们以各种方式被使用,并被指责以错误的方式使用它们(尽管在那种情况下,我以这种方式使用它们来证明 观点).

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

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

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

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

没有正确的解决方案

其他提示

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

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

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

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

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

你可能想看看 http://www.codeplex.com/nxlhttp://www.codeplex.com/umbrella 它们都是扩展方法库。我个人还没有看过源代码,但我相信那里的人能够给你一些很好的指导。

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

Core.Extensions.Base64Encode(str);

我的 Utils 类是我在全世界最好的朋友,那是在扩展方法出现之前,它们只会帮助加强我们的关系。我遵循的最大规则是让人们在可能的情况下选择他们使用的扩展框架。

Objective-C 语言自 20 世纪 90 年代初以来就有了“类别”;这些本质上与 .NET 扩展方法相同。在寻找最佳实践时,您可能希望了解 Objective-C(Cocoa 和 NeXT)开发人员围绕它们提出了哪些经验法则。

布伦特·西蒙斯 (适用于 Mac OS X 和 iPhone 的 NetNewsWire RSS 阅读器的作者)今天刚刚发布了关于他的文章 类别使用的新样式规则 并且有一点 Cocoa 社区的讨论 围绕那个帖子。

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

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

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

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

在大多数情况下,出于多种原因,我已经开始放弃使用任何扩展方法。

我停止使用它们的一些原因在上面的 Scott 博客链接中有所说明,例如“在扩展您不拥有的类型之前请三思”。如果您无法控制要扩展的类型的源,并且源类型有一些添加/更改(例如将项目移动到较新的 .NET 版本),则将来可能会遇到问题/冲突。如果较新的 .NET 版本包含与您的扩展同名的类型的方法,那么有人会被破坏。

我停止使用扩展方法的主要原因是,您无法通过阅读代码快速判断方法的来源在哪里以及谁“拥有”它。

仅阅读代码时,您无法判断该方法是该类型的扩展还是只是该类型的标准 NET API 方法。

智能感知菜单很快就会变得非常混乱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top