命名空间和类具有相同的名称?

我正在组织一个图书馆项目,并且有一个名为Scenegraph的中央pipe理器类,以及一些存在于Scenegraph命名空间中的其他类。

我真的很喜欢MyLib.ScenegraphMyLib.Scenegraph ,而其他类是MyLib.Scenegraph.* ,但似乎唯一的方法是使所有其他类的Scenegraph内部类在Scenegraph.cs文件,这太笨拙了。

相反,我已经组织它作为Mylib.Scenegraph.ScenegraphMyLib.Scenegraph.* ,这种工作,但我发现Visual Studio在某些情况下,我是否指的是类或命名空间混淆。

有没有一种很好的方法来组织这个软件包,这样对于用户来说,不用把所有的代码拼凑在一起,都是不方便的。

我不build议你像命名空间那样命名一个类,看看这个 。

框架devise指南在第3.4节“在名称空间中不要使用相同的名称作为名称空间和types”。 那是:

 namespace MyContainers.List { public class List { … } } 

为什么这个坏事? 哦,让我算一下方法。

你可以把自己陷入一种情况,你认为你指的是一件事,但实际上是指别的东西。 假设你在这个不幸的情况下结束了:你正在写Blah.DLL并导入Foo.DLL和Bar.DLL,不幸的是,它们都有一个叫做Foo的types:

 // Foo.DLL: namespace Foo { public class Foo { } } // Bar.DLL: namespace Bar { public class Foo { } } // Blah.DLL: namespace Blah { using Foo; using Bar; class C { Foo foo; } } 

编译器给出一个错误。 “Foo”在Foo.Foo和Bar.Foo之间是不明确的。 游民。 我想我会通过完全限定名称来解决这个问题:

  class C { Foo.Foo foo; } 

这现在给出了含糊不清的错误“ Foo.Foo中的Foo在Foo.Foo和Bar.Foo之间不明确 ”。 我们仍然不知道第一个Foo指的是什么,直到我们弄清楚为止,我们甚至都懒得去弄清楚第二个指的是什么。

我build议你按照microsoft.public.dotnet.languages.csharp的build议使用MyLib.ScenegraphUtil.ScenegraphMyLib.ScenegraphUtil.*

CA1724: Type Names Should Not Match Namespaces

基本上,如果你按照代码分析进行正确的编码,这个规则就不会做你正在做的事情。 代码分析对于帮助您发现潜在的问题非常有用

只要加我2分钱:

我有以下课程:

 namespace Foo { public struct Bar { } public class Foo { //no method or member named "Bar" } } 

客户是这样写的:

 using Foo; public class Blah { public void GetFoo( out Foo.Bar[] barArray ) { } } 

原谅错误GetFoo不返回输出而不是使用out参数,编译器无法parsing数据typesFoo.Bar []。 这是返回错误:无法findtypes或命名空间Foo.Bar。

看起来,当它试图编译它parsingFoo作为类,并没有find类Foo中embedded类Bar。 它也找不到名为Foo.Bar的名称空间。 它没有在名字空间Foo中寻找一个类Bar。 名字空间中的点不是句法。 整个string是一个标记,而不是由点划定的单词。

这种行为是由VS 2015运行.Net 4.6展示的