如何管理扩展方法的命名空间?

Rob*_*vey 17 c# extension-methods

您是否为所有扩展方法使用全局的catchall命名空间,或者是否将扩展方法放在与它们扩展的类相同的命名空间中?

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

我问,因为我需要扩展System.Security.Principal.IIdentity,并且将扩展方法放在System.Security.Principal命名空间中似乎有意义,但我从未见过它以这种方式完成.

小智 12

将扩展名放在与它们扩展的类相同的名称空间中.这样,当您使用该类时,您可以使用扩展.

  • 如果您正在为Uri编写扩展名,请将扩展名放在System中.
  • 如果它是DataSet的扩展,请将其放在System.Data中.

此外,微软说这是关于扩展方法:

通常,我们建议您谨慎实施扩展方法,并且只在必要时才实施.必要时,必须扩展现有类型的客户端代码应通过创建从现有类型派生的新类型来实现.

有关扩展方法的详细信息,请参阅有关扩展方法的MSDN页面.

  • 我不会将扩展放在同一个命名空间中,原因有两个。首先是不想与我不拥有的命名空间的未来版本发生冲突。因此,我的 Uri 扩展将位于 CodeCharm.System.Extensions 中。其次,我希望在调试时可以轻松发现我所在的方法不属于它“显示”所在的类的一部分,仅基于位于调用堆栈顶部的方法调用。 (4认同)

Nic*_*ver 9

如果它们是整个解决方案中使用的扩展方法(例如超过60%的类),我将它们放在解决方案的基本命名空间中(因为它们将自动导入到父命名空间中,不会每次导入常见的东西).

在这个类别中,像:
.IsNullOrEmpty(this string value).HasValue(this string value)

但是,如果它们非常具体且很少使用,我将它们放在BaseNamepace.Extensions命名空间中,因此必须手动导入它们,并且不要在intellisense中显示混乱的东西.


And*_*are 8

我建议将所有扩展方法放在一个命名空间中(顺便说一下,这也是微软通过将它们放在'System.Linq'命名空间内的单个类'Extensions'中对Linq所做的事情).

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

  • 这对于`System.Linq`是有意义的,因为所有这些扩展方法在概念上都与`System.Linq`相关. (3认同)