關於c#靜態建構函式那點事
靜態建構函式是c#的乙個新特性,其實好像很少用到。不過當我們想初始化一些靜態變數的時候就需要用到它了。這個建構函式是屬於類的,而不是屬於**例項的,就是說這個建構函式只會被執行一次。也就是在建立第乙個例項或引用任何靜態成員之前,由.net自動呼叫。
class
******class
}在使用靜態建構函式的時候應該注意幾點:
1、靜態建構函式既沒有訪問修飾符,也沒有引數。因為是.net呼叫的,所以像public和private等修飾符就沒有意義了。
2、是在建立第乙個類例項或任何靜態成員被引用時,.net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構函式了。
3、乙個類只能有乙個靜態建構函式。
4、無引數的建構函式可以與靜態建構函式共存。儘管引數列表相同,但乙個屬於類,乙個屬於例項,所以不會衝突。
5、最多隻執行一次。
6、靜態建構函式不可以被繼承。
7、如果沒有寫靜態建構函式,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動生成預設的靜態建構函式。
類的靜態建構函式也叫型別構造器,靜態構造器,他呼叫的時刻由clr來控制:
clr會選擇如下時間之一來呼叫靜態建構函式:
1,在型別的第乙個例項建立之前,或型別的非繼承欄位或成員第一次訪問之前。這裡的「之前」,代表前後銜接的意思。這裡的時刻是精確的!
2,在非繼承的靜態欄位或成員第一次訪問之前的某個時刻,具體時刻不定!
由於呼叫的時刻不確定,所以我們最好不要編寫依賴於特定的靜態建構函式的執行順序的**,這樣很容易產生不可預料的後果!
demo1:
static void main(string args)
public class a
}public class b : a
}大家猜猜結果是什麼,可能有人認為輸出的是bbbb,因為訪問b.strtext需要呼叫b類的靜態建構函式static b()。實際上輸出的結果是aaaa,因為strtext是類a的靜態字段,而類b只是繼承了這個字段,所以這裡會呼叫類a的靜態建構函式static a(),所以輸出結果是aaaa。這也沒有什麼真正可說的,相信大家都能看出這個結果的。
下面看看第二個demo:
demo2:
static void main(string args)
public class a
}public class b : a
}大家猜猜輸出結果是什麼,可能有人認為會輸出aaaa,理由是new b()之前會呼叫static b(),然後new a()之前需要呼叫static a,這樣結果是aaaa,但是實際情況並非如果,正確的結果是bbbb,原因如下:
在執行 new b(); 之前,b類的靜態建構函式會呼叫,也就是會呼叫:
static b()
當執行到strtext=「bbbb"的時候,這時需要訪問strtext欄位,而b的strtext欄位是從a類繼承的,所以這裡需要會先呼叫:
static a()
執行這個函式以後strtext的值是aaaa
然後**又回到static b()中,這時才執行static b()中的strtext="bbbb"這行,所以strtext這時的值是bbbb
當執行a a=new a();的時候,不會在呼叫a的靜態建構函式了,因為前面已經呼叫過了,靜態函式在整個應用程式域的生命週期中只會呼叫一次!
請大家多指教啊!
分類:
c#語言
好文要頂
關注我收藏該文
_eagle
關注 - 19
粉絲 - 92
+加關注 1 0
gettype和typeof的區別 以及乙個小例項
介面與抽象類那點事
posted on 2011-11-27 12:02收藏
關於c 靜態建構函式
在百科上看到c 的新特性靜態建構函式,其中提到靜態建構函式 不能繼承 今天做了個試驗,發現實際上靜態建構函式是可以繼承的,如下 using system using system.collections.generic using system.linq using system.text usin...
關於虛函式那點破事
如果你是c 程式設計師,我想你可能遇到過這樣的情況 在debug時,對著乙個函式step into,明明呼叫的是a函式,可是結果卻跳進了b函式。為什麼,call stack裡顯示的也是明明白白,就是直接進了b函式。百思不得其解,於是你懷疑是不是系統出了問題,是不是編譯器出了問題,是不是偵錯程式出了問...
關於靜態建構函式
關於靜態建構函式一直有些不特別明白,現在上一次例項,僅供參考。1public class teststaticconstructor211 12public teststaticconstructor 1317 下面是測試 第一種情況 只宣告 static void main string args...