天天看點

C#Static類和Static構造函數

Static類是不能執行個體化的, C#2.0以前為了不讓一個類在外部執行個體化,通常都是建立一個private的構造函數,現在可以通過Static類來達到這樣的目的. Static類通常用于那些隻包括static 方法或屬性的工具類, 這樣的類沒有必要進行執行個體化, 是以幹脆用static修飾,表示不能執行個體化  Static Constructor有如下特征:

1. 用于對靜态字段、隻讀字段等的初始化.       

2. 添加static關鍵字,不能添加通路修飾符,因為靜态構造函數都是私有的。    

3. 類的靜态構造函數在給定應用程式域中至多執行一次,隻有建立類的執行個體或者引用類的任何靜态成員才激發靜态構造函數

4. 靜态構造函數是不可繼承的,而且不能被直接調用。      

5. 如果類中包含用來開始執行的 Main 方法,則該類的靜态構造函數将在調用 Main 方法之前執行。  任何帶有初始值設定項的靜态字段,則在執行該類的靜态構造函數時,先要按照文本順序執行那些初始值設定項。 

6. 如果沒有編寫靜态構造函數,而這時類中包含帶有初始值設定的靜态字段,那麼編譯器會自動生成預設的靜态構造函數。

以下用例子代碼進一步說明:  

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();

  }

}

繼續閱讀