国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:24:49
字體:
來源:轉載
供稿:網友
  編寫程序的時候難免要使用到靜態成員,由于靜態成員的訪問是脫離類型對象的,所以使用非靜態構造函數,私有方法或者一些其他方法都是不合理的。.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;
 }
}

  那么大家先猜猜如下調用輸出結果是什么。

debug.writeline( a.x.tostring() );
debug.writeline( b.y.tostring() );

  其結果是“2,1”,也就是a.x的值為2,而b.y的值為1。

  分析此類問題,只要記住三點就行了。
  
  第一代碼的執行順序,代碼在前的先執行;

  第二靜態成員初始化語句要先于靜態構造函數執行;

  第三靜態成員初始化語句與靜態構造函數只執行一次。

  如果了解這三點,接下來就分析為什么會出現上面的結果。

  當調用到第一條語句的時候,

debug.writeline( a.x.tostring() );

  首先是訪問a這個類型,那么要對a這個類型的靜態成員進行初始化,其次如果有靜態構造函數,需要調用它。

  對于a的靜態成員只有“x”,按照上一單元的過程,先給其分配空間,并輔以0來初始化,其次調用其對應的成員初始化語句來初始化這個靜態成員。

  那么它的成員初始化語句是“x = b.y”,那么需要訪問“b.y”來初始化x這個靜態成員。

  對于“b.y”的訪問,就是訪問b類型,也是和訪問a一樣,首先對這個類型的靜態成員進行初始化,其次如果有靜態構造函數,需要調用它。而b的靜態成員只有“y”,先給其分配空間,并輔以0來初始化,其次調用其對應的成員初始化語句來初始化這個靜態成員。

  那么對于“y = a.x”成員初始化語句,由于此時不是第一次訪問類型a,所以不再進行靜態成員初始化和靜態構造函數的調用,對于“a.x”的訪問是直接訪問。此時“a.x”的值為0,那么y的值也為0;接著執行b的靜態構造函數,這樣處理后y的值為1。

  那么對于a中的成員初始化語句“x = b.y”,到此就執行完了,此時a類型中的x與b類型中的y都是一樣的,值為1。不過b中的靜態成員初始化語句和靜態構造函數都執行過了,而a中的靜態構造函數還未執行。因此經過a的靜態構造函數處理,a的x值為2,這也就是最后顯示的結果。

  分析過程看起來很繞,其實只要把握我前面所說的三個原則,那么在復雜的問題也一樣分析國內最大的酷站演示中心!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元江| 扶风县| 农安县| 象山县| 梅河口市| 苗栗县| 化隆| 千阳县| 交口县| 正定县| 綦江县| 和田县| 镇坪县| 盐边县| 增城市| 青田县| 河北区| 仪陇县| 宽甸| 卫辉市| 彭阳县| 四川省| 惠来县| 青铜峡市| 专栏| 高邮市| 武平县| 微山县| 瑞金市| 年辖:市辖区| 玉田县| 盱眙县| 神池县| 乐业县| 台州市| 崇信县| 太仆寺旗| 砚山县| 石河子市| 广饶县| 休宁县|