C# 如何管理扩展方法的名称空间?

C# 如何管理扩展方法的名称空间?,c#,extension-methods,C#,Extension Methods,您是为所有扩展方法使用全局、catchall命名空间,还是将扩展方法与它们扩展的类放在同一命名空间中 或者您是否使用其他方法,如应用程序或特定于库的命名空间 我问这个问题是因为我需要扩展System.Security.Principal.IIdentity,并将扩展方法放在System.Security.Principal命名空间中似乎是有意义的,但我从未见过这样做。我建议将所有扩展方法放在一个命名空间中(顺便说一句,这也是微软对Linq的做法,它将Linq放在“System.Linq”名称空间

您是为所有扩展方法使用全局、catchall命名空间,还是将扩展方法与它们扩展的类放在同一命名空间中

或者您是否使用其他方法,如应用程序或特定于库的命名空间


我问这个问题是因为我需要扩展
System.Security.Principal.IIdentity
,并将扩展方法放在
System.Security.Principal
命名空间中似乎是有意义的,但我从未见过这样做。

我建议将所有扩展方法放在一个命名空间中(顺便说一句,这也是微软对Linq的做法,它将Linq放在“System.Linq”名称空间内的单个类“Extensions”中)


由于Visual Studio没有提供有关如何定位要使用的扩展方法的线索,因此只需记住一个名称空间就可以减少混淆。

如果它们是整个解决方案中使用的扩展方法(例如,超过60%的类),我将它们放在解决方案的基本名称空间中(因为它们将在父命名空间中自动导入,所以不会每次都导入公共内容)

在这个类别中,类似于:
.IsNullOrEmpty(此字符串值)
.HasValue(此字符串值)


但是,如果它们非常具体且很少使用,我会将它们放在
basenamespace.Extensions
名称空间中,这样它们就必须手动导入,并且不会在intellisense中到处乱七八糟地显示。

将您的扩展与它们扩展的类放在同一名称空间中。这样,当您使用该类时,扩展是有效的我能帮助你

  • 如果您正在为Uri编写扩展,请将该扩展放在系统中
  • 如果它是DataSet的扩展,请将其放入System.Data中
此外,Microsoft还谈到了扩展方法:

一般来说,我们建议您 节省地实现扩展方法 只有在你必须的时候,无论何时 可能是必须扩展的客户端代码 现有类型应通过 创建从 现有类型


有关扩展方法的更多信息,请参阅关于扩展方法。

我对user276695的答案投了赞成票,这似乎是最简单的解决方案。但是我发现了一个更好的解决方案:根本没有命名空间。您可以将带有扩展方法的静态类放在文件的根目录下,而无需在其周围包装任何命名空间声明。T当扩展方法可用时,无需导入/使用任何命名空间。†

我有点担心被纳粹分子否决。但我觉得有必要支持一个稍微非正统的立场。至少在我的工作领域(IT)我发现我的大多数自定义工具在没有名称空间的情况下更易于维护,并且将所有内容都放在一个巨大的匿名名称空间中。我确信还有其他编程领域的情况也不一样。但是性能和环境不同,我只想指出,事实上,您可以在没有名称的情况下声明类ces,甚至是带有扩展方法的类-对于那些也发现一个巨大的匿名名称空间的人来说更好


†您还可以保存一级缩进。:-)即使有3个巨大的显示器,我也一直在寻找保存屏幕不动产的方法。

我的做法是将扩展放在一个不同的名称空间中,但清楚地标识我要扩展的源名称空间

通常,我通过在扩展的名称空间前面的名称空间路径的“company name”部分添加前缀,然后在后缀中添加“.Extensions”来创建名称空间

例如,如果我(没有正当理由)扩展
::System.Text.StringBuilder
,因为它是密封的,那么我将把我的扩展放入命名空间
::CodeCharm.System.Text.extensions


这是一条经验法则,当我创建扩展时,我怀疑我可以在其他解决方案中重复使用这些扩展。

如果将它们放在比当前名称空间更高的名称空间中,它们将自动可见

因此,如果您有用于以下项目的名称空间:

AdventureWorksInc.Web
AdventureWorksInc.Logic
AdventureWorksInc.DataAccess
然后直接在以下文件中声明扩展名:

namespace AdventureWorksInc
{
   public static class HtmlHelpers
   {
       public static string AutoCloseHtmlTags(this string html)
       {
           //...
       }

   }
}
每当您在AdventureWorksInc的任何子名称空间中编写代码时,都会显示此扩展方法,而不需要using语句

然而,上面的扩展展示了一个可能的缺点。由于它对字符串进行操作,它现在将显示为所有字符串的扩展方法,包括那些不是真正的HTML的字符串。这实际上不是名称空间范围的问题,只是对扩展方法的误用。这应该是一个常规的静态需要标准参数,因此调用是显式的


通常,设计良好的扩展方法和适当类型的参数不会出现在它永远不会应用的类型上。

这对于
System.Linq
,是有意义的,因为所有这些扩展方法在概念上都与
System.Linq
相关。因此,根据您的推测,将我的扩展放在
System.Security.Princ中ipal.Extensions
也有意义?这可能非常幼稚,但如果一个类文件只需要一个扩展方法,而您的名称空间可能包含几十个扩展方法,这难道不会导致很多多余的开销吗?我当然更喜欢这样做,而不是将它们放在目标类的名称空间中。但我仍然不确定是否更喜欢这样做可以在特定于项目/解决方案的命名空间上使用。目前,我在应用程序代码中使用它,但在库代码中避免使用它。(其中,库被定义为可在完全不同的解决方案中重用,可能由第三方使用,而不是全部编译为dll。)是的,库对名称空间有着更强烈的需求,因为您不知道最终将使用它们的所有项目。然而,即使使用我的私有库,我也开始跳过使用任何名称空间,并且