靜態類和靜態類成員(c# 程式設計指南)
(2009-03-25 11:51:48)
標籤:技術
分類:技術文章 靜態
類與非靜態類基本相同,但存在乙個區別:靜態類不能例項化。也就是說,不能使用 new
關鍵字建立靜態類型別的變數。因為沒有例項變數,所以要使用類名本身訪問靜態類的成員。例如,如果名為 utilityclass 的靜態類有乙個名為 methoda 的公共方法,則按下面的示例所示呼叫該方法:
c#
utilityclass.methoda();
和所有類型別一樣,當載入引用靜態類的程式時,.net framework 公共語言執行時 (clr) 將載入該靜態類的型別資訊。程式不能指定載入靜態類的確切時間。但是,可以保證在程式中首次引用該類前載入該類,並初始化該類的字段並呼叫其靜態建構函式。靜態建構函式僅呼叫一次,在程式駐留的應用程式域的生存期內,靜態類一直保留在記憶體中。
對於只對輸入引數進行運算而不獲取或設定任何內部例項欄位的方法集,靜態類可以方便地用作這些方法集的容器。例如,在 .net framework 類庫中,靜態類 system..::.math
包含的一些方法只執行數**算,而無需儲存或檢索特定 math
類例項特有的資料。
說明:
若要建立僅允許建立乙個自身例項的非靜態類,請參見 implementing singleton in c#
(在 c# 中實現單一例項)。
下表介紹靜態類的主要特性:
因此,建立靜態類與建立僅包含靜態成員和私有建構函式的類基本相同。私有建構函式阻止類被例項化。使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地新增例項成員。編譯器將保證不會建立此類的實利。
靜態類是密封的,因此不可被繼承。它們不能從除 object
外的任何類中繼承。靜態類不能包含例項建構函式,但可以包含靜態建構函式。如果非靜態類包含需要進行重要的初始化的靜態成員,也應定義靜態建構函式。有關更多資訊,請參見靜態建構函式(c# 程式設計指南)。
示例下面是乙個靜態類的示例,它包含兩個在攝氏溫度和華氏溫度之間執行來回轉換的方法:
c#
public
static
class temperatureconverter
publicstatic double fahrenheittocelsius(string temperaturefahrenheit)
}
class testtemperatureconverter
", f);
break;
case"2":
console.write("please enter the fahrenheit temperature: ");
c = temperatureconverter.fahrenheittocelsius(console.readline());
console.writeline("temperature in celsius: ", c);
break;
default:
console.writeline("please select a convertor.");
break; }
// keep the console window open in debug mode.
console.writeline("press any key to exit.");
console.readkey();
}
}
靜態成員
非靜態類可以包含靜態的方法、字段、屬性或事件。即使沒有建立類的例項,也可以呼叫該類中的靜態成員。始終通過類名而不是例項名稱訪問靜態成員。無論對乙個類建立多少個例項,它的靜態成員都只有乙個副本。靜態方法和屬性不能訪問其包含型別中的非靜態欄位和事件,並且不能訪問任何物件的例項變數(除非在方法引數中顯式傳遞)。
更常見的做法是宣告具有一些靜態成員的非靜態類,而不是將整個類宣告為靜態類。靜態欄位有兩個常見的用法:一是記錄已例項化物件的個數,二是儲存必須在所有例項之間共享的值。
靜態方法可以被過載但不能被重寫,因為它們屬於類,不屬於類的任何例項。
雖然字段不能宣告為 static const,但 const
欄位的行為在本質上是靜態的。這樣的字段屬於型別,不屬於型別的例項。因此,可以同對待靜態字段一樣使用 classname.membername 表示法來訪問 const 字段。不需要物件例項。
c# 不支援靜態區域性變數(在方法範圍內宣告的變數)。
通過在成員的返回型別之前使用 static 關鍵字可以宣告靜態類成員,如下面的示例所示:
c#
public
class automobile
}
publicstatic
void drive()
publicstatic event eventtype runoutofgas;
// other non-static fields and properties... }
靜態成員在第一次被訪問之前並且在呼叫靜態建構函式(如有存在)之前進行初始化。若要訪問靜態類成員,應使用類名而不是變數名來指定該成員的位置,如下面的示例所示:
c#
automobile.drive();
int i = automobile.numberofwheels;
如果類包含靜態字段,請提供在載入類時初始化這些欄位的靜態建構函式。
對靜態方法的呼叫以 microsoft 中間語言 (msil) 生成呼叫指令,而對例項方法的呼叫生成 callvirt 指令,該指令還檢查 null 物件引用。但是,兩者之間的效能差異在大多數時候並不明顯。
靜態類和靜態類成員(C )
靜態類與非靜態類基本相同,但存在乙個區別 靜態類不能例項化。也就是說,不能使用 new 關鍵字建立靜態類型別的變數。因為沒有例項變數,所以要使用類名本身訪問靜態類的成員。例如,如果名為 utilityclass 的靜態類有乙個名為 methoda 的公共方法,則按下面的示例所示呼叫該方法 c uti...
C 靜態類成員和靜態類成員函式
一 靜態類成員 include class stringbad 靜態類成員有乙個特點 無論建立多少物件,程式都只能建立乙個靜態變數副本。也就是說所有物件共享同乙個靜態成員,就像你家 可供全家家庭成員共享一樣。假設建立了10個stringbad物件,將有10個str成員和len成員,但是只共享乙個nu...
C 基礎 靜態成員和靜態類
靜態成員 1.靜態成員是被static關鍵字修飾的.是屬於類的.通過類名.靜態成員來訪問.2.例項成員 沒有被static關鍵字修飾的 是屬於物件的.通過物件名.例項成員來訪問.3.例項成員屬於物件.4.在這個類第一次被載入的時候,這個類下面的所有的靜態成員會被載入 5.靜態成員只被建立1次.所以靜...