學習C#靜態函數及變數的一個精典例子與代碼 (1)用於對靜態欄位、唯讀欄位等的初始化。 (2)添加static關鍵字,不能添加存取修飾詞,因為靜態建構函式都是私人的。 (3)類的靜態建構函式在給定應用程式定義域中至多執行一次:只有建立類的執行個體或者引用類的任何靜態成員才激發靜態建構函式 (4)靜態建構函式是不可繼承的,而且不能被直接調用。 (5)如果類中包含用來開始執行的 Main 方法,則該類的靜態建構函式將在調用 Main 方法之前執行。任何帶有初始值設定項的靜態欄位,則在執行該類的靜態建構函式時,先要按照文本順序執行那些初始值設定項。 (6)如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態欄位,那麼編譯器會自動產生預設的靜態建構函式。 以下用例子代碼進一步說明: /************************************************** * 靜 態 構 造 函 數 練 習 * (1)①②③……為執行順序 * (2)輸出結果: static A() * static B() * X = 1, Y = 2 ***************************************************/ using System; class A { public static int X; static A() //④ 執行完後返回到③ { X = B.Y + 1; Console.WriteLine("static A()"); } } class B { public static int Y = A.X + 1; //③ 調用了A的靜態成員, // 轉到A的靜態建構函式----> static B() //② 如果帶有初始值設定項的靜態欄位, // 執行該類的靜態建構函式時, // 先要按照文本順序執行那些初始值設定項。 // 轉到初始值設定項----> { Console.WriteLine("static B()"); } static void Main() //① 程式入口, // 如果類中包含用來開始執行的 Main 方法, // 該類的靜態建構函式將在調用 Main 方法之前執行。 // 轉到B的靜態建構函式----> { Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y); //⑤ 輸出結果 Console.ReadLine(); } } 什麼是靜態方法 靜態方法的1個特別作用就是不用建立類的對象,而直接用類裡面的方法(public static 2個條件), 例如: class A { public static void b() {..............} } 可以這樣直接用: A.b(); 那麼在程式中如何可以利用靜態欄位和靜態構造方法,通常適用于于一些不會經常變化而又頻繁使用的資料,比如連接字串,配置資訊等,當滿足上面所說的兩點時,進行一次讀取,以後就可以方便的使用了,同時也節約了託管資源,因為對於靜態成員,一個靜態欄位只標識一個儲存位置。對一個類無論建立了多少個執行個體,它的靜態欄位永遠都只有一個副本。 static: 類變數(對象共用)可以用類名,對象名點取,間接使用。 類方法 1)static方法中不能直接使用非靜態成員, 因為非靜態成員與執行個體相關,通過對象點取間接使用 2)static方法中不能用this(與執行個體相關) 3)非static方法中可以使用static成員 靜態方法有什麼弊端? 問:我翻看一些源碼工程時看到幾乎沒有什麼靜態方法唯獨Ms的SQLHelper中幾乎全是靜態方法 為什麼呢? 答1:在一些系統中使用非常頻繁的方法都使用靜態方法可以提高系統效能我是這麼認為的 :) 答2:本身不可升級, 重寫 這要看一個軟體產品的目的是什麼了. 答3:為了方便,不用執行個體化,但這樣程式編譯運行時就佔用了系統資源 答4:靜態屬性和方法在程式啟動的時候,就全部裝入記憶體的,而不管這些方法、屬性以後有沒有用到。即使是沒有人再訪問程式,這部分記憶體仍然不會釋放還有就是,所有訪問者看到的靜態屬性的資料幾乎都是一樣的,比如A使用者佈建了UserName這個屬性,B使用者訪問的時候,得到的UserName仍然是A使用者佈建的那個。這種特性,如果用在固定資料中,那不會有太大問題,比如連接字串之類的 答5:靜態方法/資料成員是屬於類的,不是屬於某一個對象的,因而調用它不需要執行個體化;靜態方法和待用資料成員相當於共用變數。為該類的所有對象所共有,因而在需要共用資料時,定義這種類型時很好的選擇。 一但定義一個類後(不一定要執行個體化對象)該類的所有靜態成員就載入記憶體(並不是程式啟動,就裝入記憶體,沒有定義該類時它不會載入記憶體) 靜態成員的範圍與它所屬的類的範圍相同 |