C#Static類和Static構造函數

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

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();
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章