C# 聲明

2018-09-28 18:41 更新

聲明

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ù)種不同的聲明空間,其具體描述如下:

  • 在程序的所有源文件內(nèi),未閉包于 namespace-declaration 內(nèi)的 namespace-member-declarations 是屬于一個叫做全局聲明空間(global declaration space)的組合聲明空間內(nèi)的成員;
  • 在程序的所有源文件內(nèi),位于 namespace-declarations 內(nèi)的 namespace-member-declarations 若擁有相同的完全限定命名空間名,則其屬于同一個組合聲明空間內(nèi);
  • 每個類、結構或接口的聲明都將創(chuàng)架一個新的聲明空間。名稱將通過 class-member-declarations、struct-member-declarations、interface-member-declarationstype-parameters 引入此聲明空間。除了重載實例構造函數(shù)和靜態(tài)構造函數(shù),類或結構不允許聲明包含一個與其類名或結構名同名的成員。類、結構或結構允許重載聲明方法和索引器。此外類或結構允許重載聲明實例構造函數(shù)與操作符。比方說類、結構或接口可以包含多個聲明為同名的方法,這些所聲明的方法擁有不同的簽名(signature,第三章第六節(jié))。注意,基類并不在該類的聲明空間內(nèi),基接口也不在該接口的聲明空間內(nèi),所以派生類或接口允許聲明一個與繼承成員同名的成員。這類成員隱藏(hide)了它們繼續(xù)的那些成員;
  • 每一個委托聲明都會創(chuàng)建一個新的聲明空間。名稱通過形參(formal parameters)fixed-parametersparameter-arrays 以及 type-parameters 引入這個聲明空間;
  • 每個枚舉聲明都會創(chuàng)建一個新的聲明空間。名稱通過 enum-member-declarations 引入這個聲明空間;
  • 每一個方法聲明(method declaration)、索引器聲明(indexer declaration)、操作符聲明(operator declaration)、實例構造函數(shù)聲明(instance constructor declaration)和匿名函數(shù)(anonymous function)都會創(chuàng)建一個名曰局部變量聲明空間(local variable declaration space)的新聲明空間。名稱通過形參 fixed-parametersparameter-arrays 以及 type-parameters 引入這個聲明空間。如果有函數(shù)成員或匿名函數(shù)成員的函數(shù)體,則將會被是為嵌套于局部變量聲明空間內(nèi)。局部變量聲明控件和嵌套局部變量聲明空間內(nèi)包含同名元素將引發(fā)錯誤。因此在一個閉包聲明空間內(nèi),如果包含嵌套聲明空間的話,那么不能在其內(nèi)部聲明一個與閉包聲明空間內(nèi)變量或常量同名的局部變量或常量。只有一種可能使得兩個聲明空間內(nèi)包含同名元素,那就是這兩個聲明空間彼此不相互包含。
  • 每個 blockswitch-block,以及 for、foreachusing 語句將為局部變量和局部常量創(chuàng)建局部變量聲明空間。名稱將通過 local-variable-declarationslocal-constant-declarations 引入這個聲明空間。注意,作為函數(shù)成員主體或匿名函數(shù)主體的塊,或是位于函數(shù)成員主體或匿名函數(shù)主體內(nèi)的塊,將嵌套在本地變量聲明空間內(nèi)(這個本地變量聲明空間是為其參數(shù)所聲明的)。因此,如果某個方法的局部變量和參數(shù)同名,那么將引發(fā)一個錯誤。
  • 每個 blockswitch-block 為每個標簽(label)創(chuàng)建相互隔離的聲明空間。名稱將通過 labeled-statements 引入該聲明空間,并通過 goto-statements 來引用。塊的標簽聲明空間(label declaration space)可包含任何嵌套塊。因此在嵌套塊內(nèi)不能聲明一個與其所在閉包塊(enclosing block)標簽同名的標簽。

聲明名稱的文本順序一般而言是不重要的(no significance)。具體而言,聲明并使用命名空間、常量、方法、屬性、事件、索引器、操作符、實例構造函數(shù)、析構函數(shù)、靜態(tài)構造函數(shù)以及類型,其文本順序并不重要。在以下情況下聲明順序比較重要:

  • 字段聲明和局部變量聲明的聲明順序意味著其初始化器(如果有的話)的執(zhí)行順序;
  • 局部變量必須在使用前定義(第三章第七節(jié));
  • when constant-expression 被省略時,枚舉成員聲明(第十四章第三節(jié))的順序是重要的。

命名空間的聲明空間是開放的(open ended),兩個相同完全限定名(fully qualified name)的命名空間擁有同一個聲明空間。比方說:

namespace Megacorp.Data
{
    class Customer
    {
        ...
    }
}
namespace Megacorp.Data
{
    class Order
    {
        ...
    }
}

這兩個命名空間位于同一個聲明空間內(nèi),在此例中兩個類的完全限定名分別是 Megacorp.Data.CustomerMegacorp.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();
    }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號