?? 命名空間.txt
字號:
C# 程序是利用命名空間組織起來的。命名空間既用作程序的“內部”組織系統,也用作“外部”組織系統(一種向其他程序公開自己擁有的程序元素的方法)。
編譯單元定義了源文件的總體結構。編譯單元的組成方式如下:先是零個或多個 using 指令,后跟零個或多個全局屬性,然后是零個或多個命名空間成員聲明。
compilation-unit:(編譯單元:)
using-directivesopt global-attributesopt namespace-member-declarationsopt(using 指令可選全局屬性可選 命名空間成員聲明可選)
一個 C# 程序由一個或多個編譯單元組成,每個編譯單元都用一個單獨的源文件來保存。編譯 C# 程序時,所有這些編譯單元一起進行處理。因此,這些編譯單元間可以互相依賴,甚至以循環方式互相依賴。
一個編譯單元中的 using 指令的作用范圍包括該編譯單元內的所有全局屬性和命名空間成員聲明,但是不會影響其他編譯單元。
編譯單元的全局屬性(第 17 節)用于指定目標程序集和模塊的屬性。程序集和模塊充當類型的物理容器。程序集可以包含若干個在物理上分離的模塊。
一個程序中各編譯單元中的命名空間成員聲明用于為一個稱為“全局命名空間”的單個聲明空間提供成員。例如:
文件 A.cs:
class A {}
文件 B.cs:
class B {}
這兩個編譯單元是為該全局命名空間提供成員的,在本例中它們分別聲明了具有完全限定名 A 和 B 的兩個類。由于這兩個編譯單元為同一聲明空間提供成員,因此如果它們分別包含了一個同名成員的聲明,將會是個錯誤。
一個命名空間聲明的組成方式如下:先是關鍵字 namespace,后跟一個命名空間名稱和體,然后加一個分號(可選)。
namespace-declaration:(命名空間聲明:)
namespace qualified-identifier namespace-body ;opt(命名空間 限定標識符 命名空間體 ;可選)
qualified-identifier:(限定標識符:)
identifier(標識符)
qualified-identifier . identifier(限定標識符 . 標識符)
namespace-body:(命名空間體:)
{ using-directivesopt namespace-member-declarationsopt }({ using 指令可選 命名空間成員聲明可選 })
命名空間聲明可以作為頂級聲明出現在編譯單元中,或是作為成員聲明出現在另一個命名空間聲明內。當命名空間聲明作為頂級聲明出現在編譯單元中時,該命名空間成為全局命名空間的一個成員。當一個命名空間聲明出現在另一個命名空間聲明內時,該內部命名空間就成為包含著它的外部命名空間的一個成員。無論是何種情況,一個命名空間的名稱在它所屬的命名空間內必須是唯一的。
命名空間隱式地為 public,而且在命名空間的聲明中不能包含任何訪問修飾符。
在命名空間體內,可選用 using 指令來導入其他命名空間和類型的名稱,這樣,就可以直接地而不是通過限定名來引用它們。可選的命名空間成員聲明用于為命名空間的聲明空間提供成員。請注意,所有的 using 指令都必須出現在任何成員聲明之前。
命名空間聲明中的限定標識符可以是單個標識符或者是由“.”標記分隔的標識符序列。后一種形式允許一個程序直接定義一個嵌套命名空間,而不必按詞法嵌套若干個命名空間聲明。例如,
namespace N1.N2
{
class A {}
class B {}
}
在語義上等效于
namespace N1
{
namespace N2
{
class A {}
class B {}
}
}
命名空間是可擴充的,兩個具有相同的完全限定名的命名空間聲明是在為同一聲明空間(第 3.3 節)提供成員。在下面的示例中
namespace N1.N2
{
class A {}
}
namespace N1.N2
{
class B {}
}
上面的兩個命名空間聲明為同一聲明空間提供了成員,在本例中它們分別聲明了具有完全限定名 N1.N2.A 和 N1.N2.B 的兩個類。由于兩個聲明為同一聲明空間提供成員,因此如果它們分別包含一個同名成員的聲明,就將出現錯誤。
using 指令方便了對在其他命名空間中定義的命名空間和類型的使用。using 指令僅影響命名空間或類型名稱(第 3.8 節)和簡單名稱(第 7.5.2 節)的名稱解析過程,與聲明不同,using 指令不會將新成員添加到它們與所在的編譯單元或命名空間相對應的聲明空間中。
using 命名空間指令將一個命名空間中所包含的類型導入到直接封閉該指定的編譯單元或命名空間體中,從而可以直接使用這些被導入的類型的標識符而不必加上它們的限定名。
using-namespace-directive:(using 命名空間指令:)
using namespace-name ;(using 命名空間名稱 ;)
在包含 using 命名空間指令的編譯單元或命名空間體中的成員聲明內,可以直接引用包含在給定命名空間中的那些類型。例如:
namespace N1.N2
{
class A {}
}
namespace N3
{
using N1.N2;
class B: A {}
}
上面的示例中,在 N3 命名空間中的成員聲明內,N1.N2 的類型成員是直接可用的,所以類 N3.B 從類 N1.N2.A 派生。
using 命名空間指令導入包含在給定命名空間中的類型,但要注意,它不導入嵌套的命名空間。在下面的示例中
namespace N1.N2
{
class A {}
}
namespace N3
{
using N1;
class B: N2.A {} // Error, N2 unknown
}
using 命名空間指令導入包含在 N1 中的類型,但是不導入嵌套在 N1 中的命名空間。因此,在 B 的聲明中引用 N2.A 導致編譯時錯誤,原因是在涉及的范圍內沒有名為 N2 的成員。
與 using 別名指令不同,using 命名空間指令可能導入一些類型,它們的標識符在封閉該指令的編譯單元或命名空間體內的已被用來定義另外一些類型。事實上,using 命名空間指令導入的名稱會被封閉該指令的編譯單元或命名空間體中具有類似名稱的成員所隱藏。例如:
namespace N1.N2
{
class A {}
class B {}
}
namespace N3
{
using N1.N2;
class A {}
}
此處,在 N3 命名空間中的成員聲明內,A 引用 N3.A 而不是 N1.N2.A。
當由同一編譯單元或命名空間體中的 using 命名空間指令導入多個命名空間時,如果它們所包含的類型中有重名的,則直接引用該名稱就被認為是不明確的。在下面的示例中
namespace N1
{
class A {}
}
namespace N2
{
class A {}
}
namespace N3
{
using N1;
using N2;
class B: A {} // Error, A is ambiguous
}
N1 和 N2 都包含一個成員 A,而由于 N3 將兩者都導入,所以在 N3 中引用 A 會導致一個編譯時錯誤。這種名稱沖突,有兩種解決辦法:使用限定名來引用 A,或者利用 using 別名指令為想要引用的某個特定的 A 啟用一個別名。例如:
namespace N3
{
using N1;
using N2;
using A = N1.A;
class B: A {} // A means N1.A
}
同 using 別名指令一樣,using 命名空間指令不會將任何新成員添加到與它所在的編譯單元或命名空間相關的聲明空間,因而,它僅在該編譯單元或者命名空間體內有效。
對 using 命名空間指令所引用的命名空間名稱的解析過程,與對 using 別名指令所引用的命名空間或類型名稱的解析過程相同。因此,同一編譯單元或命名空間體中的 using 命名空間指令不會互相影響,而且可以按照任何順序編寫。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -