2017-04-01 179 views
0

我得到的問題是「命名空間被用作一種」在C#項目。我明白了爲什麼會發生,我明白我需要做些什麼來解決它。但對我來說沒有意義,所以這裏的問題是理解C#上下文中名稱空間和類的設計。命名空間和類 - 解決命名歧義

我希望這個問題是來自其他足夠的不同,因爲我不問如何解決問題,而是如何保持邏輯和相關的命名,而以應對時局,我形容它。

我按照MSDN約定命名的解決方案。所以我有一個解決方案稱爲:

TesterStories.Voxam 

我有兩個項目中。一個是TesterStories.Voxam.App,看起來像這樣:

namespace TesterStories.Voxam.App 
{ 
    TesterStories.Voxam.Parser parser = new TesterStories.Voxam.Parser(); 

    class Program 
    { 
    } 
} 

的問題是在第三行。

大概是因爲我有另一個項目叫TesterStories.Voxam.Parser,它看起來像這樣:

namespace TesterStories.Voxam.Parser 
{ 
    public class Parser 
    { 
    } 
} 

因此,它是說,它不喜歡,我有「分析器」以我命名的項目?

但根據MSDN準則,如果解析器是特徵,那就是我要呼籲的命名空間:[Company].[Project].[Feature]。班級是Parser,因爲畢竟這是班級的職責。

所以它看起來像什麼,我要做的是:

namespace TesterStories.Voxam.Parser 
{ 
    public class Xyzzy 
    { 
    } 
} 

所以在這裏我改變了我的ParserXyzzy類。現在,回到我的文件,該文件是造成問題,我可以做到這一點:

using TesterStories.Voxam.Parser; 

namespace TesterStories.Voxam.App 
{ 
    class Program 
    { 
     Xyzzy parser = new Xyzzy(); 
    } 
} 

所以我得到它 - 但它意味着我必須改變我的課是什麼不是。我意識到我可以稱之爲AppParserParserApp或其他什麼。

在這種情況下,什麼開發商往往辦?你改變你的名字空間還是你改變了你的班級?雖然,在我的情況,我所描述的功能,按照MSDN準則和正確的命名基於它做什麼類)。

回答

1

的命名空間和類名是不是這裏的問題。 在您的原始代碼中,您需要指定此「解析器」對象應該位於TesterStories.Voxam.Parser命名空間的哪個類。

原密碼:在TesterStories.Voxam.Parser命名空間

TesterStories.Voxam.Parser parser = new TesterStories.Voxam.Parser(); 

什麼類/類型這個應該是什麼?

你需要做的:

TesterStories.Voxam.Parser.*Parser* parser = new TesterStories.Voxam.Parser.*Parser*(); 

(*增加了對重點:))

或者,就像你在最後的代碼段一樣,添加using語句:

using TesterStories.Voxam.Parser; 

所以,你可以這樣做:

Parser parser = new Parser(); 

編輯 - 更完整的例子(對於「使用」建議):

namespace TesterStories.Voxam.App 
{ 
    using TesterStories.Voxam.Parser; 

    class Program 
    { 
     Parser parser = new Parser(); 
    } 
} 

namespace TesterStories.Voxam.Parser 
{ 
    public class Parser 
    { 
    } 
} 
+0

好吧,我得到的第一部分。關於第二部分(在你的「或」之後),如果我在我的文件中使用了'TesterStories.Voxam.Parser;'並且執行此操作:'Parser parser = new Parser();'工作。我得到'Parser是一個名字空間,但是像一個類型一樣使用'。 我只是想確保我不會誤讀你的第二部分。但是,我再次看到你的第一部分的重點。 –

+0

啊,但我可以這樣做:'Parser.Parser parser = new Parser.Parser();'有趣。從Java背景來看,這對我來說是一種認知摩擦。我仍然覺得我必須命名它不是的(在某種程度上),所以我不必重複(「Parser.Parser」)。但是,這是我的問題,而不是其他人的問題!感謝您的答覆。 –

+0

@JeffNyman看看答案的編輯是否有幫助(因爲你不應該重複「Parser.Parser」)。 –