C# 程序中的聲明定義了程序的組成元素。C# 程序有系統(tǒng)地使用了命名空間(namespace,第九章),命名空間可以包含類型聲明(type declarations)和嵌套命名空間聲明(nested namespace declarations)。類型聲明(type declarations,第九章第六節(jié))用于定義類(class,第十章)、結構(struct,第十章第十四節(jié))、接口(interface,第十三章)、枚舉(enum,第十四章)以及委托(delegates,第十五章)。類型聲明中允許的成員種類取決于類型聲明的形式。比方說類聲明可以包含聲明常量(constants,第十章第四節(jié))、字段(fields,第十章第五節(jié))、方法(methods,第十章第六節(jié))、屬性(properties,第十章第七節(jié))、事件(events,第十章第八節(jié))、索引器(indexers,第十章第九節(jié))、操作符(operators,第十章第十節(jié))、實例構造函數(shù)(instance constructors,第十章第十一節(jié))、靜態(tài)構造函數(shù)(static constructors,第十章第十二節(jié))、析構函數(shù)(destructors,第十章第十三節(jié))和嵌套類型(nested types,第十章第 3.8 節(jié))。
聲明在其所屬聲明空間(declaration space)內(nèi)定義一個名稱。除重載成員(第三章第六節(jié))外,同一聲明空間(declaration space)內(nèi)出現(xiàn)兩個以上同名成員會引發(fā)「編譯時錯誤(compile-time error)」。同一聲明空不可同時包含不同類型的同名方法。比方說,聲明空間絕無包含同名字段與方法之可能。
有數(shù)種不同的聲明空間,其具體描述如下:
namespace-declaration
內(nèi)的 namespace-member-declarations
是屬于一個叫做全局聲明空間(global declaration space)的組合聲明空間內(nèi)的成員;namespace-declarations
內(nèi)的 namespace-member-declarations
若擁有相同的完全限定命名空間名,則其屬于同一個組合聲明空間內(nèi);class-member-declarations
、struct-member-declarations
、interface-member-declarations
或 type-parameters
引入此聲明空間。除了重載實例構造函數(shù)和靜態(tài)構造函數(shù),類或結構不允許聲明包含一個與其類名或結構名同名的成員。類、結構或結構允許重載聲明方法和索引器。此外類或結構允許重載聲明實例構造函數(shù)與操作符。比方說類、結構或接口可以包含多個聲明為同名的方法,這些所聲明的方法擁有不同的簽名(signature,第三章第六節(jié))。注意,基類并不在該類的聲明空間內(nèi),基接口也不在該接口的聲明空間內(nèi),所以派生類或接口允許聲明一個與繼承成員同名的成員。這類成員隱藏(hide)了它們繼續(xù)的那些成員;fixed-parameters
與 parameter-arrays
以及 type-parameters
引入這個聲明空間;enum-member-declarations
引入這個聲明空間;fixed-parameters
和 parameter-arrays
以及 type-parameters
引入這個聲明空間。如果有函數(shù)成員或匿名函數(shù)成員的函數(shù)體,則將會被是為嵌套于局部變量聲明空間內(nèi)。局部變量聲明控件和嵌套局部變量聲明空間內(nèi)包含同名元素將引發(fā)錯誤。因此在一個閉包聲明空間內(nèi),如果包含嵌套聲明空間的話,那么不能在其內(nèi)部聲明一個與閉包聲明空間內(nèi)變量或常量同名的局部變量或常量。只有一種可能使得兩個聲明空間內(nèi)包含同名元素,那就是這兩個聲明空間彼此不相互包含。block
或 switch-block
,以及 for
、foreach
和 using
語句將為局部變量和局部常量創(chuàng)建局部變量聲明空間。名稱將通過 local-variable-declarations
和 local-constant-declarations
引入這個聲明空間。注意,作為函數(shù)成員主體或匿名函數(shù)主體的塊,或是位于函數(shù)成員主體或匿名函數(shù)主體內(nèi)的塊,將嵌套在本地變量聲明空間內(nèi)(這個本地變量聲明空間是為其參數(shù)所聲明的)。因此,如果某個方法的局部變量和參數(shù)同名,那么將引發(fā)一個錯誤。block
或 switch-block
為每個標簽(label)創(chuàng)建相互隔離的聲明空間。名稱將通過 labeled-statements
引入該聲明空間,并通過 goto-statements
來引用。塊的標簽聲明空間(label declaration space)可包含任何嵌套塊。因此在嵌套塊內(nèi)不能聲明一個與其所在閉包塊(enclosing block)標簽同名的標簽。聲明名稱的文本順序一般而言是不重要的(no significance)。具體而言,聲明并使用命名空間、常量、方法、屬性、事件、索引器、操作符、實例構造函數(shù)、析構函數(shù)、靜態(tài)構造函數(shù)以及類型,其文本順序并不重要。在以下情況下聲明順序比較重要:
when constant-expression
被省略時,枚舉成員聲明(第十四章第三節(jié))的順序是重要的。命名空間的聲明空間是開放的(open ended),兩個相同完全限定名(fully qualified name)的命名空間擁有同一個聲明空間。比方說:
namespace Megacorp.Data
{
class Customer
{
...
}
}
namespace Megacorp.Data
{
class Order
{
...
}
}
這兩個命名空間位于同一個聲明空間內(nèi),在此例中兩個類的完全限定名分別是 Megacorp.Data.Customer
和 Megacorp.Data.Order
。因為這兩個聲明位于同一個聲明空間內(nèi),所以如果這兩個類的完全限定名是一樣的話,會引發(fā)一個「編譯時錯誤」。
如上文所指定,塊(block)的聲明空間可以嵌套任意塊。因此,在下例中,F(xiàn) 方法和 G 方法會引發(fā)「編譯時錯誤」,因為外部塊中聲明了 i,那么內(nèi)部塊就不能重復聲明(redeclared)。然而 H 方法和 I 方法是合法的,這是由于兩個 i 的聲明都位于相互獨立的非嵌套塊(separate non-nested blocks)內(nèi)。
class A
{
void F() {
int i = 0;
if (true) {
int i = 1;
}
}
void G() {
if (true) {
int i = 0;
}
int i = 1;
}
void H() {
if (true) {
int i = 0;
}
if (true) {
int i = 1;
}
}
void I() {
for (int i = 0; i < 10; i++)
H();
for (int i = 0; i < 10; i++)
H();
}
}
更多建議: