1. 程式人生 > >C# 靜態類和靜態函式

C# 靜態類和靜態函式

學習靜態類和靜態函式。
這篇部落格的內容來自MSDN,當然內容是我自己看MSDN翻譯出來的。

正文

靜態類和非靜態類其實基本相同。兩者有一處不同:靜態類不能被例項化。換句話來說,你不能夠用new去為一個靜態類例項出一個物件來。因為靜態類中根本沒有例項成員。你只能通過使用類名來訪問靜態類變數。舉一個例子:如果你的靜態類名叫UtilityClass,而這個類中有個方法叫做MethodA,你只能像下面這樣去呼叫。

UtilityClass.MethodA();
可以把靜態類當作一個很方便的容器,儲存一組函式,這些函式只是由輸入引數來操作,而不需要讀寫類內的例項feild。例如,在。Net類庫中System.Math靜態類包含的方法只執行數學計算,而不需要儲存和檢索Math類例項特有的資料,就是說,你需要通過指定類名和方法名來使用類成員,就像下面的例子展示的那樣。

和所有類型別一樣,當載入引用靜態類的程式時,靜態類的型別資訊通過公共語言執行時得以載入。程式並不能精確的指定出,這個類何時載入。但是,CLR保證在靜態類首次引用前,載入這個類,初始化類的欄位並且呼叫它的建構函式。

以下包含了靜態類的主要特性
只包含靜態成員
不能被例項化
sealed封閉的
不能包含例項建構函式

因此,建立一個 靜態類和建立一個只包含靜態成員和私有建構函式的類基本是一樣的。私有建構函式方式類例項化。使用靜態類的好處是,編譯器可以檢查確保沒有偶然的新增例項成員。編譯器會確保不能創建出物件。

靜態類是封閉的,因此不能繼承。除了Objecet類,它不能繼承自其他類。靜態類不能包含例項建構函式。但,可以包含靜態建構函式。如果非靜態類需要初始化重要的靜態成員,非靜態類也應該定義靜態建構函式。

靜態成員
非靜態類可以包含靜態函式,欄位,屬性和方法。

非靜態類可以包含靜態方法,欄位,屬性,事件。即使當類的例項沒有創建出來,靜態成員也是可以呼叫的。靜態成員是通過類名訪問的,而不是物件名。無論建立了多少物件,靜態成員只存在一份。靜態方法和屬性不能訪問非靜態欄位、事件XX,而且他們不能訪問任何物件的例項,(除非它在方法引數中顯示傳遞 )。比起去宣告一個完全的靜態類,宣告一個包含靜態成員的非靜態類更為典型。

去共同維護一個計算例項化類的靜態欄位,或者儲存一個必須共享給所有物件的值。
靜態方法可以 過載 ,但 不可以重寫,因為它們屬於類,不屬於任何例項。
雖然欄位不能宣告為static const,從靜態的行為來說,一個const欄位本質是靜態的。它屬於靜態型別,而不是例項型別。因此,const欄位可以同樣通過使用ClassName.MemberName來訪問。

C#不支援靜態區域性變數(宣告在方法範圍的變數),

在靜態成員第一次被訪問之前,靜態構造器之前,如果呼叫其中一個靜態成員會例項化。
去訪問一個靜態類成員,要使用類名而不是一個變數名
、如果一個類包含靜態欄位,你可以寫一個靜態構造器,當類載入時,建構函式可以初始化他們。

一個靜態成員的呼叫產生了MSIL中的一個呼叫指令,而一個例項方法的呼叫產生了一個callvir指令,
然而,大多數時候這兩者之間的不同不是那麼重要。