2013-11-26 43 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;