猿问

“使用”指令应该在名称空间内还是在名称空间之外?

“使用”指令应该在名称空间内还是在名称空间之外?

我一直在跑步StyleCop在一些C#代码上,它不断地报告说,我的using指令应该在命名空间中。

是否有技术原因将using在名称空间内而不是在名称空间之外的指令?


忽然笑
浏览 391回答 3
3回答

温温酱

这个线程已经有了一些很好的答案,但是我觉得我可以用这个额外的答案带来更多的细节。首先,请记住带有句点的命名空间声明,如:namespace&nbsp;MyCorp.TheProduct.SomeModule.Utilities{ &nbsp;&nbsp;&nbsp;&nbsp;...}完全等同于:namespace&nbsp;MyCorp{ &nbsp;&nbsp;&nbsp;&nbsp;namespace&nbsp;TheProduct &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;namespace&nbsp;SomeModule &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;namespace&nbsp;Utilities &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}如果你想,你可以using所有这些级别的指令。(当然,我们希望usingIt‘只在一个地方,但根据语言,这是合法的。)解析隐含的类型的规则可以松散地表述如下:首先搜索内部最“范围”以进行匹配,如果没有发现,则从一个级别到下一个范围进行搜索,以此类推。直到找到匹配为止。如果在某个级别找到多个匹配,如果其中一个类型来自当前程序集,则选择该类型并发出编译器警告。否则,放弃(编译时错误)。现在,让我们在两个主要约定的具体示例中明确说明这意味着什么。(1)外部使用:using&nbsp;System;using&nbsp;System.Collections.Generic;using&nbsp;System.Linq;//using&nbsp;MyCorp.TheProduct;&nbsp;&nbsp;<--&nbsp;uncommenting&nbsp;this&nbsp;would&nbsp;change&nbsp;nothingusing&nbsp; MyCorp.TheProduct.OtherModule;using&nbsp;MyCorp.TheProduct.OtherModule.Integration;using&nbsp;ThirdParty;namespace&nbsp;MyCorp.TheProduct.SomeModule .Utilities{ &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;C&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ambiguous&nbsp;a; &nbsp;&nbsp;&nbsp;&nbsp;}}在上述情况下,找出哪种类型Ambiguous是,搜索按以下顺序进行:嵌套类型C(包括继承的嵌套类型)当前命名空间中的类型MyCorp.TheProduct.SomeModule.Utilities命名空间中的类型MyCorp.TheProduct.SomeModule类型MyCorp.TheProduct类型MyCorp类中的类型。零命名空间(全局命名空间)类型System,&nbsp;System.Collections.Generic,&nbsp;System.Linq,&nbsp;MyCorp.TheProduct.OtherModule,&nbsp;MyCorp.TheProduct.OtherModule.Integration,和ThirdParty另一项公约:(2)内部使用:namespace&nbsp;MyCorp.TheProduct.SomeModule.Utilities{ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;System; &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;System.Collections.Generic; &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;System.Linq; &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;MyCorp.TheProduct;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MyCorp&nbsp;can&nbsp;be&nbsp;left&nbsp;out;&nbsp;this&nbsp;using&nbsp;is&nbsp;NOT&nbsp;redundant &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;MyCorp.TheProduct.OtherModule;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MyCorp.TheProduct&nbsp;can&nbsp;be&nbsp;left&nbsp;out &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;MyCorp.TheProduct.OtherModule.Integration;&nbsp;&nbsp;&nbsp;//&nbsp;MyCorp.TheProduct&nbsp;can&nbsp;be&nbsp;left&nbsp;out &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;ThirdParty; &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;C&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ambiguous&nbsp;a; &nbsp;&nbsp;&nbsp;&nbsp;}}现在,搜索类型Ambiguous按以下顺序排列:嵌套类型C(包括继承的嵌套类型)当前命名空间中的类型MyCorp.TheProduct.SomeModule.Utilities类型System,&nbsp;System.Collections.Generic,&nbsp;System.Linq,&nbsp;MyCorp.TheProduct,&nbsp;MyCorp.TheProduct.OtherModule,&nbsp;MyCorp.TheProduct.OtherModule.Integration,和ThirdParty命名空间中的类型MyCorp.TheProduct.SomeModule类型MyCorp类中的类型。零命名空间(全局命名空间)(请注意,MyCorp.TheProduct是“3”的一部分因此在“4”之间不需要。及“5.”)结束语无论您在名称空间声明中还是在名称空间声明之外,都有可能会有人稍后向具有较高优先级的名称空间中的一个添加具有相同名称的新类型。此外,如果嵌套命名空间的名称与类型相同,则可能会导致问题。将用户从一个位置移动到另一个位置总是很危险的,因为搜索层次结构会发生变化,并且可能会找到另一种类型。因此,选择一个惯例,并坚持它,这样你就不会再移动使用。默认情况下,VisualStudio的模板将使用外名称空间(例如,如果使VS在新文件中生成一个新类)。有用法的一个(微小的)优势外然后,您可以为全局属性使用指令,例如[assembly: ComVisible(false)]而不是[assembly: System.Runtime.InteropServices.ComVisible(false)].
随时随地看视频慕课网APP
我要回答