關於C 靜態建構函式那點事

2021-07-24 03:32:07 字數 1906 閱讀 2809

關於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...