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

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

編輯:關於C語言

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

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,這也就是最後顯示的結果。

分析過程看起來很繞,其實只要把握我前面所說的三個原則,那麼在復雜的問題也一樣分析

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