理解C#中靜態Static與單例Singleton

iDotNetSpace發表於2010-03-02

理解靜態Static關鍵字


    與其他語言不通,C#沒有全域性變數和全域性函式的感念,C#的所有欄位和方法都出現在一個類的上下文中,在C#中與全域性欄位或函式等價的就是靜態欄位或方 法。“全域性欄位或方法”與“C#的靜態欄位或方法”沒有功能上的差別,只是靜態欄位和靜態方法可以加上“訪問修飾符”如Private,從而可以對訪問進 行限制,提供更好的封裝。
    首先來看靜態欄位
    直接在類名之後訪問靜態欄位如(ClassName.StaticField)在類的所有例項中都共享靜態欄位的儲存位置,靜態欄位是全域性的。打個比方我 們有一套5元人民幣的模具(最好還是不要有),這個模具就是類,用這個模具印出來的紙幣就是例項,雖然這些紙幣基本相同,但是他的編號肯定不同,(如果編 號相同,基本可以肯定是假幣,假幣的製造模具和真幣的模具是兩個不同的類)。每張紙幣(例項)的編號就可以理解是模具(類)中的靜態欄位,因為 Static決定了它所修飾的欄位是全域性的。靜態欄位屬於類本身,而不屬於類構造出的例項。
    靜態方法
    直接在類名之後訪問靜態方法如(ClassName.StaticMethod)當然這種訪問方式不需要一個例項,由於靜態方法不是通過一個具體的例項訪問的,所以在靜態方法內使用this是無效的。
    靜態構造器
    靜態構造器設計為對類(不是類例項)進行初始化的一種方式。在執行時訪問類時自動呼叫靜態構造器。
例如
Class Emp
{
static Emp
{
ID= Rand(1,100);
}
public static int ID = 112;
}
    我們在首次使用Emp.ID時,ID的值是不是112,而是1到100的隨機數。
    靜態類
    如果一個類中僅有方法,沒有例項欄位,那我們就沒有必要使用這個類的例項,這種類最好設計為靜態類。所以靜態類不能被例項化。既然我們不想要這個類的實 例,這個靜態類的內部也不應該有例項欄位或方法。而且靜態類不能被擴充套件。在C#1.0中不能宣告靜態類,是通過私有構造器實現的。

    單例模式的目的是為了在程式中提供類的唯一例項,而且僅提供唯一的訪問點。靜態不需要例項,僅提供一個全域性功能。使用單例可以繼承,實現介面,而靜態類不 能。靜態方法不能訪問類中的例項欄位,因為靜態方法不是通過例項來訪問的。而單例中的方法卻可以訪問那個唯一例項中的例項欄位。靜態方法在執行後,會釋放 掉它所建立的所有物件。而單例中的方法卻可以保留。靜態欄位僅是提供全域性的功能,大家共享同一記憶體位置。訪問單例中的欄位是類的唯一例項中的欄位,大家只 能訪問這個例項的欄位。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-628367/,如需轉載,請註明出處,否則將追究法律責任。

相關文章