我有一个用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
答案 0 :(得分:0)
显而易见的选择是将扩展方法移动到特定的命名空间中,只有在需要时才能导入。
答案 1 :(得分:0)
我最近将所有扩展方法移动到命名空间*.Extensions
,其中*
是 extendee 所属的任何命名空间。这甚至适用于BCL类型,并且允许我仅导入我感兴趣的扩展,同时还避免混乱的智能感知。
我区分实用程序函数和扩展方法的唯一建议是添加xml注释,表明它是一个扩展方法。
''' <summary>(extension) If the dictionary contains the specified key: return its value; otherwise null.</summary>