擁有進入點(entry point)的程序集稱應(yīng)用程序(application)。當運行一應(yīng)用程序時,將創(chuàng)建一新應(yīng)用程序域(application domain)。同一個應(yīng)用程序可在同一臺機器(machine)上同時運行多個實例,并且每個實例都有自己的應(yīng)用程序域。
應(yīng)用程序域作為應(yīng)用程序狀態(tài)(application state)之容器(container),使應(yīng)用程序相互隔離(isolation)。應(yīng)用程序域是定義于應(yīng)用及所用類庫的類型之容器與邊界。加載入不同的應(yīng)用程序域的同一類型是相互涇渭分明的,而其實例化的對象也不會在應(yīng)用程序域之間直接共享。比方說,對于這些類型的靜態(tài)變量,每個應(yīng)用程序域都自有一份其副本,同時這些類型的靜態(tài)構(gòu)造函數(shù)在應(yīng)用程序域中至多運行一次。實現(xiàn)可以自由為應(yīng)用程序域的創(chuàng)建和銷毀提供指定實現(xiàn)(implementation-specific)策略或機制。
應(yīng)用程序啟動(Application startup)時,執(zhí)行環(huán)境會調(diào)用一個特指的方法作為應(yīng)用程序的進入點(entry point)。入口點方法一貫稱為 Main,且可為下列簽名中的一種:
static void Main() {...}
static void Main(string[] args) {...}
static int Main() {...}
static int Main(string[] args) {...}
如上所示,進入點可以選擇 int 為其返回值。這個返回值通常被用在應(yīng)用程序終止(application termination,第三章第二節(jié))時。
進入點有個可選形參。這個參數(shù)可以用任何名稱,但它的類型必須是 string[]
。如果出現(xiàn)形參,那么當應(yīng)用程序啟動時,執(zhí)行環(huán)境將通過命令行參數(shù)(command-line arguments)的方式創(chuàng)建并傳遞指定的 string[]
實參。實參 string[]
永不為空(null),但它可能長度為零(如果命令行沒有指定實參的話)。
由于 C# 支持方法重構(gòu)(overload),類或結(jié)構(gòu)可以包含一個方法的多個定義,前提是每個重載版本都有不同的方法簽名。然而,在一個程序內(nèi),類或結(jié)構(gòu)內(nèi)不能同時存在多個叫做 Main 的方法,因為 Main 被限定為只能作為應(yīng)用程序的入口點。如果提供超過一個參數(shù)或者唯一參數(shù)類型不是 string[]
,則允許重載多個 Main 版本。
應(yīng)用程序可由多個類與結(jié)構(gòu)組成,也許會有多個 Main 方法在這些類或結(jié)構(gòu)內(nèi),由于 Main 的定義限定它只能是應(yīng)用程序入口點,所以在這種情況下,外部機制(諸如命令行編譯器選項)必須從中選擇其一作為應(yīng)用程序的進入點。
在 C# 中每一個方法都必須定義為類或結(jié)構(gòu)的成員,一般情況下方法的聲明可訪問性(declared accessibility,第三章第 5.1 節(jié))是由訪問控制修飾符(access modifiers,第十章第 3.5 節(jié))所決定的;同樣,類型的聲明聲明可訪問性也是由其訪問控制修飾符所決定的。為了調(diào)用所給定類型的給定方法,類型與成員都必須可被訪問(accessible),然應(yīng)用程序進入點是特例。不管應(yīng)用程序進入點的聲明可訪問性及其閉包類型的聲明可訪問性,執(zhí)行環(huán)境總能訪問到它們。
應(yīng)用程序進入點方法(entry point method)不能放入泛型類聲明內(nèi)。
在其它各方面,進入點方法與非進入點方法的行為類似。
更多建議: