C#靜態成員和靜態函數

靜態變量使用 static 修飾符進行聲明,在類被實例化時創建,通過類進行訪問不帶有 static 修飾符聲明的變量稱做非靜態變量。

static變量在對象被實例化時創建,通過對象進行訪問一個類的所有實例的同一C#靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值。

靜態函數的實現裏不能使用非靜態成員,如非靜態變量、非靜態函數等。

class StaticTest
{
    static int x = 0;
    int y = 0;
     public void SetX(int a)
     {
          x = a;
     }
     public void SetY(int a)
     {
          y = a;
     }
     public void Print()
     {
          Console.WriteLine("x = {0}  y = {1}", x, y);
     }
     static void Main(string[] args)
     {
          StaticTest st = new StaticTest();
          StaticTest st1 = new StaticTest();
          st.SetX(10);      //將10賦給x;
          st.SetY(10);      //將10賦給y;
          st.Print();                  //顯示:x=10 y=10
         
          st1.SetX(20);      //將20賦給x
          st1.SetY(20);     //將20賦給x
          st1.Print();                //顯示:x=20 y=20

          st.Print();                  //由於x是靜態變量,所以在此調用第一次初始化實例st時,靜態變量已經變爲20, 輸出:x=20 y=10

          st.SetX(30);      
          st.SetY(30);        
          st.Print();       //由於x是靜態變量,所以在此調用初始化實例st時,靜態變量已經變爲30, 輸出:x=30 y=30

          st1.Print();                //由於x是靜態變量,所以在此調用st1實例時,靜態變量已經變爲30, 輸出:x=30 y=20

       }

}

靜態類:

聲明爲static,它僅包含靜態成員,不能用new靜態類的實例。使用靜態類來包含不與特定對象關聯的方法。

功能:僅包含靜態成員,不能被實例化,是密封的,不能包含實例構造函數,可包含靜態構造函數以分配初始值或設置某個靜態變量。

優點:編譯器能夠執行檢查以確保不致偶然地添加勢力成員。編譯器將保證不會創建此類的實例。

靜態方法:

是一種特殊的成員方法,不屬於類的某一個具體的實例。非靜態方法可以訪問類中的任何成員,而靜態只能訪問類中的靜態成員。

靜態構造函數:

  • 用於對靜態字段、只讀字段等的初始化。              
  • 添加static關鍵字,不能添加訪問修飾符,因爲靜態構造函數都是私有的。      
  • 類的靜態構造函數在給定應用程序域中至多執行一次:只有創建類的實例或者引用類的任何靜態成員才激發靜態構造函數
  • 靜態構造函數是不可繼承的,而且不能被直接調用。            
  • 如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行。任何帶有初始值設定項的靜態字段,則在執行該類的靜態構造函數時,先要按照文本順序執行那些初始值設定項。  
  • 如果沒有編寫靜態構造函數,而這時類中包含帶有初始值設定的靜態字段,那麼編譯器會自動生成默認的靜態構造函數。

C#靜態方法及屬性在程序啓動的時候,就全部裝入內存的,而不管這些方法、屬性以後有沒有用到。即使是沒有人再訪問程序,這部分內存仍然不會釋放還有就是,所有訪問者看到的靜態屬性的數據幾乎都是一樣的,比如A用戶設置了UserName這個屬性,B用戶訪問的時候,得到的UserName仍然是A用戶設置的那個。這種特性,如果用在固定數據中,那不會有太大問題,比如連接字符串之類的

C#靜態方法/數據成員是屬於類的,不是屬於某一個對象的,因而調用它不需要實例化;靜態方法和靜態數據成員相當於共享變量。爲該類的所有對象所共有,因而在需要共享數據時,定義這種類型時很好的選擇。 一但定義一個類後(不一定要實例化對象)該類的所有靜態成員就載入內存(並不是程序啓動,就裝入內存,沒有定義該類時它不會載入內存) 靜態成員的作用域與它所屬的類的作用域相同

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章