靜態建構函式是c#的乙個新特性,其實好像很少用到。不過當我們想初始化一些靜態變數的時候就需要用到它了。這個建構函式是屬於類的,而不是屬於**例項的,就是說這個建構函式只會被執行一次。也就是在建立第乙個例項或引用任何靜態成員之前,由.net自動呼叫。
class ******class
} 在使用靜態建構函式的時候應該注意幾點:
1、靜態建構函式既沒有訪問修飾符,也沒有引數。因為是.net呼叫的,所以像public和private等修飾符就沒有意義了。
2、是在建立第乙個類例項或任何靜態成員被引用時,.net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構函式了。
3、乙個類只能有乙個靜態建構函式。
4、無引數的建構函式可以與靜態建構函式共存。儘管引數列表相同,但乙個屬於類,乙個屬於例項,所以不會衝突。
5、最多隻執行一次。
6、靜態建構函式不可以被繼承。
7、如果沒有寫靜態建構函式,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動生成預設的靜態建構函式。
c#高效程式設計裡說到,這樣一段話:
建立某個型別的第乙個例項時,所進行的操作順序為:
1.靜態變數設定為0
2.執行靜態變數初始化器
3.執行基類的靜態建構函式
4.執行靜態建構函式
5.例項變數設定為0
6.執行衯變數初始化器
7.執行基類中合適的例項建構函式
8.執行例項建構函式
同樣型別的第二個以及以後的例項將從第五步開始執行.
勘誤如下:
1.靜態變數設定為0;
2.執行靜態變數初始化器;
3.執行靜態建構函式;
4.例項變數設定為0;
5.執行例項變數初始化器;
6.對基類執行前述1、2、3步驟,如果在前述任一步驟中使用了基類的靜態成員,則立即對基類執行前述1、2、3步驟後返回,本步驟跳過;
7.基類例項變數設定為0;
8.執行基類例項變數初始化器;
9.執行基類例項建構函式;
10.執行例項建構函式;
類的靜態建構函式也叫型別構造器,靜態構造器,他呼叫的時刻由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 靜態建構函式
c 靜態建構函式 靜態建構函式是 c 的乙個新特性,在程式設計過程中用處並不廣,它的主要目的是用於初始化一些靜態的變數。因為這個建構函式是屬於類的,而不屬於任何乙個例項,所以這個建構函式只會被執行一次,而且是在建立此類的第乙個例項或引用任何靜態成員之前,由 net 自動呼叫。在程式中我們可以這樣寫 ...
c 靜態建構函式
c 靜態建構函式,又稱類建構函式。它是屬於類的,不屬於任何乙個類的例項。它具有以下特點 1 以static定義的,無訪問修飾符,無返回型別,無引數的建構函式,如 code class test 2 不能通過 顯式的呼叫靜態建構函式 3 靜態建構函式在類的靜態成員第一次訪問或第乙個類例項建立之前由系統...
C 靜態建構函式
c 靜態建構函式 duduhe譯 簡介 net c 提供靜態建構函式功能,用以初始化靜態資料及執行某項特殊操作,該操作可能僅需執行一次。靜態建構函式用如下格式來宣告 static classname 以下任意情況發生時,靜態建構函式自動呼叫 l類例項的建立。l類的任意乙個靜態成員 屬性或方法 被呼叫...