我最近一直在使用扩展方法,并且发现它们有很多用途.我唯一的问题是记住它们的位置以及使用哪些命名空间来获取扩展方法.
但是,我最近考虑过在System命名空间,System.Collections命名空间或其他一些有意义的系统命名空间中编写扩展方法.例如,我已经实现了以下内容.
namespace System { ///Various array extensions public static class ArrayExtensions { ///Converts the array to a hex string /// The value. ///The array as a hex string public static string ToHexString(this byte[] value) { var hex = new StringBuilder(value.Length * 2); foreach (byte b in value) { hex.AppendFormat("{0:X2}", b); } return hex.ToString(); } } }
这是正确的做法吗?
来自框架设计指南(第2版):
不要将扩展方法放在与扩展类型相同的命名空间中,除非它是用于向接口添加方法或用于依赖关系管理.
虽然这没有明确地涵盖您的场景,但您通常应该避免扩展Framework命名空间(或您无法控制的任何命名空间),而是选择将这些扩展放在它们自己的命名空间中.如果您强烈想要对分组进行"分组"(以便集合扩展在一起等),那么您可以引入一个子名称空间.在您的方案中,对集合的扩展将位于System.Collection.Extensions
命名空间Company.Collections
或甚至是Company.Collections.Extension
命名空间中.
为了使用扩展方法,必须导入包含赞助者类(定义扩展方法的类)的命名空间.如果将扩展方法添加到其中一个标准.NET Framework命名空间,它们将始终(并且隐式)可用.
您应该避免扩充您没有主控制的名称空间,因为将来的更改可能会破坏您的代码(例如,通过引入重复项).
我倾向于使用不同的根命名空间来模仿标准命名空间,该命名空间将所有子命名空间标识为属于我的工作.根命名空间可以是您的名称,组织的名称或标识该命名空间内容的其他名称.
例如,如果要扩展System.Collections
,可以使用NickR.Collections
或NickR.System.Collections
.