2012-01-26 34 views
14

對不起,如果這個問題已被問到。我開始學習C#並注意到C#不會自動導入嵌套的命名空間。 我不明白:在C中自動導入嵌套的命名空間#

using System; 

應該自動導入包含在System命名空間權的所有類? 所以應該不用我來寫

using System.Windows.Form; 

我會明白,如果using Windows.Form甚至工作。但編譯器無法解決它!那麼在此之前using System;有什麼意義? 那麼爲什麼using System;自動導入System.Windows以及System.Windows.Forms--對不起,如果單詞導入在這裏是錯誤的..也許移動到全局命名空間是正確的術語。

+3

C#不能這樣工作,在Java中,您可以使用通配符導入命名空間,但無論出於何種原因C#設計人員選擇不這樣做。我不確定辯論原因是否有建設性。 – CodingGorilla

+2

Closters - 這是一個合法的問題。 – Oded

+1

@CodingGorilla:「爲什麼」不是辯論;有一個明確的理由(即,正如Oded所說,C#命名空間是邏輯的,而不是物理分組)。 – Brian

回答

18

C#不是Java。

A using directive被使用,因此您不必輸入類型的完全限定名稱。它還有助於消除類型名稱的歧義(例如使用別名)。

例如,在Console的情況下,您無需鍵入System.Console

瞭解命名空間和程序集之間的區別很重要 - 命名空間是邏輯類型的分組。組件是一個物理類型的分組。命名空間可以跨越程序集。

當你參考的組件(這更像是在Java中導入一個包),您可以訪問公衆類型它的所有。爲了使用你需要唯一標識的類型。這是通過命名空間完成的 - using指令僅僅意味着您不必鍵入該類型的全限定名稱。

+0

因此,使用將導入當前名稱空間中的所有類,但是當它命中一個嵌套名稱空間時,它會忽略它?除非我明確指出它..是這一點嗎? –

+0

@LewsTherin - 它不是「忽略」它。你只是沒有指定「快捷方式」。 '使用'指令被使用,所以你不必指定類型的完整「路徑」。如果需要,可以使用完整路徑來訪問類型,但使用''使用'指令只是確保您不必輸入太多... – Oded

+0

添加對組件的引用意味着「從此程序集中加載所有類型默認AppDomain「,通過'using'指令您可以告訴您的代碼目前哪些類型是_visible_。 – Restuta

11

using指令有兩種用途:

要允許在命名空間中使用的類型,這樣你就不必 限定該命名空間下使用的類型:

使用System.Text;

爲名稱空間或類型創建別名。這個 被稱爲使用別名指令。

using Project = PC.MyCompany.Project;

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

然而,你必須要注意的是系統和System.Windows.Form不通過名稱本身,無論如何連接。如果您導入(使用)系統,這意味着您將在此類中使用系統組件類型。 您可以真正使用Visual Studio項目中的參考部分中指定的實際參考(即使不使用語句,因爲這只是類型的快捷方式)。

+0

+1。好點--C#允許命名空間在組件之間進行拆分,因此您的項目可能沒有導入(或者想要導入)其他程序集。 – TrueWill

+0

我剛剛意識到我很困惑。 我一直使用導入混淆?我認爲他們必須是不同的東西.. C#沒有導入類嗎?我知道C++和Java的.. –

+1

@LewsTherin - 在.NET中,你添加一個_reference_到包含你想要「導入」的類型的程序集。 – Oded

4

C#不導入嵌套命名空間,這是設計。

命名空間範圍允許您組織代碼,併爲您提供一種創建全局唯一類型的方法 。

嵌套名稱空間用於對相關功能進行分組,但使用它的部分按需。

我想你不會想要像System這樣的大名字空間的所有類型,如果你唯一需要的是System.Windows

所以可能的問題是爲什麼C#沒有像java那樣的像using System.*;那樣的東西。我不知道答案,但我想這是因爲KISS原則。這件事情就像使用

select *

你永遠不會知道你會添加什麼類型的,以及它們如何影響現有的代碼。

1

即使在Java中你必須明確地寫

import System.*; 

大部分你做的時間不希望所有嵌套的命名空間。這些只會使IntelliSense混亂。

0

「使用」給定的名稱空間意味着您可以訪問所有實現的定義直接,而不是它遞歸查找嵌入式名稱空間;否則會破壞「使用」聲明的目的。

存在名稱空間以避免類名不明確。當您使用「語句」時,您可以避免使用名稱空間中嵌套的完全限定類型,只要您不知道可能會發生(或很少)模糊。

1

「using」語法允許您快速訪問已在項目設置中列爲引用的名稱空間。如果名稱空間被列爲引用,則您已經可以通過全名訪問它,而不使用「using」指令。只保存擊鍵。

0

不,這不是它的工作原理。

而且我會針對你所說的提出一個很好的論點:intellisnse會變得瘋狂,找到你想要的將會是地獄。

您確實可以訪問每個可用的名稱空間上的所有內容(帶點),using關鍵字簡化了這一點,因爲您不必指定類或結構體來自哪個名稱空間「來自」(我的意思是定義) 。

+0

我不會基於您選擇的編輯器(例如:一個智能感知)的功能。我會設計一個只有最簡單的編輯器的功能(例如:notepad.exe)。 –

+0

爲了避免依賴於編輯器,我可以爲編譯器做一個類似的參數:編譯會困難得多,因爲對於你使用的所有東西都沒有在本地定義,它必須檢查每個模塊的每個可能的子樹你用。除了困難和浪費之外,這可能會導致很多名稱衝突。 –