程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#箴言:用靜態構造函數初始化靜態成員(1)

C#箴言:用靜態構造函數初始化靜態成員(1)

編輯:關於C語言

編寫程序的時候難免要使用到靜態成員,由於靜態成員的訪問是脫離類型對象的,所以使用非靜態構造函數,私有方法或者一些其他方法都是不合理的。.Net提供了成員初始化語句和靜態構造函數來初始化靜態成員。

根據上一個單元,我們可以知道靜態成員的初始化語句會早於靜態構造函數執行,其次還知道成員初始化語句的好處和一些限制。這裡要提的一點就是,靜態構造函數和實例構造函數之間的區別,因為靜態構造函數是由CLR調用執行的,所以靜態構造函數只能是一個,同時不能還有參數。那麼靜態構造函數相對於成員初始化的一些弊端都不復存在。

此外,對於成員初始化最大的問題,就是異常無法捕獲,可能對於普通成員來說,還可以在構造類型對象的時候加上try-catch;而對於靜態成員來說,有時無法確定哪一個類型訪問語句會先執行,如果對每個使用類型的地方都加上try-catch,會降低程序可讀性。但如果把這種異常散發出去,會導致整個程序崩潰。那麼使用靜態構造函數就能比較好的捕獲異常,並進行異常處理。

對於靜態成員初始化語句和靜態構造函數一個對比大致如下。

簡便性 安全性 異常處理 靜態成員初始化 最簡便 比較安全 非常難 靜態構造函數 比較簡便 最安全 容易

那麼到底用什麼方法來初始化靜態成員呢,給出以下兩點建議:

第一就是簡單靜態成員,例如類型為值類型等,使用成員初始化語句來完成;

第二靜態成員初始化比較復雜,或者有可能出現異常,那麼用靜態構造函數來完成。

本單元的內容基本上講完了,現在說說靜態成員最主要的一個應用“Singleton”,就是保證此類型的對象唯一性。其實實現很簡單,如下就舉一個簡單的例子。

public class MySingleton
{
 private static readonly MySingleton _theOneAndOnly;
 static MySingleton()
 {
  _theOneAndOnly = new MySingleton();
 }
 public static MySingleton TheOnly
 {
  get{ return _theOneAndOnly; }
 }
 /// <summary>
 /// Private constructor to avoid object created from outside
 /// </summary>
 private MySingleton()
 {}
}

對於靜態成員何時被初始化,其實仔細看我上一個單元所說的對象構造步驟就可以分析出來。可能看起來比較抽象,尤其在分析嵌套關系的時候,現在就舉一個例子來進行說明。

class A
{
 public static int X = B.Y;
 static A()
 {
  ++X;
 }
}
class B
{
 public static int Y = A.X;
 static B()
 {
  ++Y;
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved