在.Net中使用扩展方法的最佳做法是什么?
我曾经看到过这些东西被用到了每一个方面,并被指责用错了方式(尽pipe在那种情况下,我是用这种方式来certificate一个观点的 )。
那么,您认为采用扩展方法的最佳做法是什么?
开发团队是否应该创build一个扩展方法库并将其部署到各个项目中?
是否应该有一个开源项目forms的通用扩展方法集合?
更新:已决定创build一个组织广泛的扩展方法库
即将发布的“框架devise指南”第二版将为实施扩展方法提供一些指导,但总的来说:
你只应该定义扩展方法“在哪里做语义”,并提供与每个实现相关的帮助函数。
你也应该避免扩展System.Object,因为并不是所有的.NET语言都能够把扩展方法作为扩展。 (例如,VB.NET需要将其作为静态扩展类中的常规静态方法调用。
除非扩展接口,否则不要在与扩展types相同的名称空间中定义扩展方法。
不要将具有相同签名的扩展方法定义为“真实”方法,因为它永远不会被调用。
你可能想看一下http://www.codeplex.com/nxl和http://www.codeplex.com/umbrella这两个扩展方法库。; 我个人没有看过源代码,但我敢肯定,那里的家伙将能够给你一些好的指针。
我已经把我的扩展方法和我的Core库包含在Utils类中,因为使用我的框架的人可能会发现这些方法是有用的,但是对于最终开发人员可以select扩展方法库的大规模部署,我build议把所有的扩展插入自己的命名空间,甚至是自己的项目文件,这样人们可以select添加一个引用或者使用语句,或者只需要在需要的地方添加,就像这样:
Core.Extensions.Base64Encode(str);
我的公用事业class是我全世界最好的朋友,只是在延伸方法出现之前,他们只是帮助加强了我们的关系。 我要做的最大的规则是让人们select他们正在使用的扩展框架。
Objective-C语言自20世纪90年代初以来就有了“类别” 这些与.NET扩展方法基本相同。 在寻找最佳实践时,您可能想看看Objective-C(Cocoa和NeXT)开发人员在他们周围提出了哪些经验法则。
Brent Simmons (NetNewsWire RSS阅读器的作者,Mac OS X和iPhone)今天刚刚发布了他关于类别使用的新样式规则,围绕该职位的Cocoa社区进行了一些讨论 。
我认为这取决于扩展方法的用途。
- 与项目的特定业务需求相关的扩展方法(不pipe它们是连接到基本数据types还是自定义对象)都不应包含在分布在多个项目中的库中。
- 与基本数据types(int,string等)相关的扩展方法或具有更广泛应用的generics可以在项目中打包和分发。
注意不要在全球范围内包含几乎没有应用的扩展方法,因为它们只会阻塞智能感知,并可能导致混淆和/或滥用。
当我第一次发现扩展时,我真的滥用和滥用了它们。
在很大程度上,我已经开始摆脱使用任何扩展方法的原因有很多。
我停止使用它们的一些原因在Scott上面的博客链接中有记载,例如“在扩展你不拥有的types之前先考虑一下”。 如果您无法控制要扩展的types的源,那么如果源types有一些添加/更改(例如,将项目移动到更新的.NET版本),则可能会在将来遇到问题/冲突。 如果较新的.NET版本包含与扩展名同名的types的方法,则会有人被破坏。
我停止使用扩展方法的主要原因是,你不能通过阅读代码的方法来快速判断方法的来源以及谁拥有它。
当读完代码时,您无法判断方法是扩展还是只是一种标准的.NET API方法。
智能菜单真的很麻烦。