2

我有一个用 VB.NET 编写的包含扩展方法的库。VB.NET 有两个特征在我看来与扩展方法的概念不一致:

  • 扩展方法必须在模块中声明(扩展方法
  • 所有模块成员都在命名空间范围内(类型提升

这意味着扩展方法总是可以在命名空间级别访问,或者根本无法访问。这没有意义,因为它们的范围在概念上是它们扩展的类型,而不是命名空间。

将方法声明为扩展这一事实会影响其命名,因为虽然全局实用程序方法可能包含类型,例如GetDictionaryValueOrNull,但扩展方法可能只是GetValueOrNull因为它应该已经清楚地为该Dictionary类型声明了它。当扩展方法是全局的时,这可能会令人困惑:假设我们在一个(非字典)类中,它有一个GetValue方法。如果我们键入“GetValue”,Visual Studio 将同时列出“GetValue”和“GetValueOrNull”,使其看起来好像当前类支持这两种操作。

是否有任何解决方案(除了“用 C# 编写”)?我可以将模块标记为非全局模块,或者至少强制 Visual Studio 仅在扩展方法实际被查找为扩展方法时才显示它们吗

Visual Studio 用户语音的建议:http: //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4228049-include-an-option-to-disable-the-promotion-of-scop

4

2 回答 2

0

我最近将所有扩展方法都移到了一个命名空间*.Extensions,扩展对象所属*的任何命名空间都在哪里。这甚至适用于 BCL 类型,并且允许我只导入我感兴趣的扩展,同时还避免了混乱的智能感知。

我对区分实用程序函数和扩展方法的唯一建议是添加 xml 注释,表明它是一种扩展方法。

''' <summary>(extension) If the dictionary contains the specified key: return its value; otherwise null.</summary>
于 2013-07-23T19:47:56.117 回答
0

显而易见的选择是将您的扩展方法移动到特定的命名空间中,您只在需要时才导入它们。

于 2013-07-23T19:41:03.530 回答