2013-11-26 105 views
0

我有一个有几个名称空间的结构,并且在每个名称空间中,我有一个静态类,它是该名称空间的网络中的一个小型小蜘蛛。像部门主管一样。名称空间和类之间的名称冲突

我们以两个命名空间Foo.Bar.BazFoo.Bar.Quux为例。

我有一个文件,它看起来像这样:

namespace Foo.Bar.Baz 
{ 
    static class Baz 
    { 
    public static void DoSomething() 
    { 
     Console.Writeline("Doing something..."); 
    } 
    } 
} 

,然后第二个文件:

using Foo.Bar.Baz 
namespace Foo.Bar.Quux 
{ 
    static class Quux 
    { 
    public static void GetToWork() 
    { 
     Baz.DoSomething(); 
    } 
    } 
} 

现在,我得到了第二个文件的错误,当我尝试编译,因为它认为巴兹是命名空间而不是班级。但是因为我有using Foo.Bar.Baz这行,所以在该命名空间内使用任何类而不需要在名称空间的名称前加上前缀应该没问题吧?我可以正确使用来自该名称空间的其他内容,但不能使用同名的类。

它有点感觉像编译器偷偷把这一行添加到每个文件:using Foo.Bar

而且,我不能只是把静态BazFoo.Bar命名空间内从那以后,我会得到错误说Foo.Bar.Baz不是一个命名空间(因为我有其他的东西在该命名空间,并具有使用该命名空间的文件)。然后看起来编译器看到静态类,并决定Foo.Bar.Baz是一个静态类,而不是一个名称空间。

当然,我可以将静态类重命名为Manager之类的东西,但是我仍然必须在需要从两个名称空间访问内容的文件中拼写出完整的Baz.Manager.SomeMethodQuux.Manager.SomeMethod。这感觉相当复杂,我宁愿只是它是Baz.SomeMethodQuuz.SomeMethod

任何想法?

+5

我的想法不是命名类像命名空间 – Jehof

+5

请参阅http://blogs.msdn.com/b/ericlippert/archive/2010/03/09/do-not-name-a-class-the-same- as-its-namespace-part-one.aspx和系列中的后续文章。 –

+0

(有重复的问题,但我现在没有时间去查找它们。) –

回答

0

由于Baz是一个静态类,它不能包含实例成员。所以,DoSomething()必须声明为静态方法。

一旦你有了这个,你可以这样做:

using Foo.Bar.Baz; 

public void GetToWork() 
{ 
    Baz.Baz.DoSomething(); 
} 

或本:

using baz = Foo.Bar.Baz.Baz; 

public void GetToWork() 
{ 
    baz.DoSomething(); 
} 

但是,我做的是对使用相同的名称在你的问题的意见达成一致命名空间(一组类的逻辑容器)及其包含的类(封装数据和行为)可能会导致可读性/可维护性问题。

1

也许这可以帮助:

using Baz = Foo.Bar.Baz.Baz;