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

首頁 > 編程 > C# > 正文

C#中靜態構造函數的幾點說明介紹

2020-01-24 02:52:48
字體:
來源:轉載
供稿:網友

靜態構造函數是C#的一個新特性,其實好像很少用到。不過當我們想初始化一些靜態變量的時候就需要用到它了。這個構造函數是屬于類的,而不是屬于哪里實例的,就是說這個構造函數只會被執行一次。也就是在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。

復制代碼 代碼如下:

class SimpleClass
{
// Static constructor
static SimpleClass()
{
//
}
}

在使用靜態構造函數的時候應該注意幾點:

1、靜態構造函數既沒有訪問修飾符,也沒有參數。因為是.NET調用的,所以像public和private等修飾符就沒有意義了。

2、是在創建第一個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,也就是說我們無法直接調用靜態構造函數,也就無法控制什么時候執行靜態構造函數了。

3、一個類只能有一個靜態構造函數。

4、無參數的構造函數可以與靜態構造函數共存。盡管參數列表相同,但一個屬于類,一個屬于實例,所以不會沖突。

5、最多只運行一次。

6、靜態構造函數不可以被繼承。

7、如果沒有寫靜態構造函數,而類中包含帶有初始值設定的靜態成員,那么編譯器會自動生成默認的靜態構造函數。
 

靜態構造函數趣談!
類的靜態構造函數也叫類型構造器,靜態構造器,他調用的時刻由CLR來控制:

CLR會選擇如下時間之一來調用靜態構造函數:
 1,在類型的第一個實例創建之前,或類型的非繼承字段或成員第一次訪問之前。這里的“之前”,代表前后銜接的意思。這里的時刻是精確的!

 2,在非繼承的靜態字段或成員第一次訪問之前的某個時刻,具體時刻不定!

由于調用的時刻不確定,所以我們最好不要編寫依賴于特定的靜態構造函數的執行順序的代碼,這樣很容易產生不可預料的后果!

下面大家看看以下的Demo,我們來更加深入的看看靜態構造函數的一些有趣的行為:

Demo1:

復制代碼 代碼如下:

static void Main(string[] args)
{
Console.WriteLine(B.strText); 
}
public class A
{
public static string strText;
static A()
{
strText = "aaaa"; 
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}

大家猜猜結果是什么,可能有人認為輸出的是bbbb,因為訪問B.strText需要調用B類的靜態構造函數static B()。實際上輸出的結果是aaaa,因為strText是類A的靜態字段,而類B只是繼承了這個字段,所以這里會調用類A的靜態構造函數static A(),所以輸出結果是aaaa。這也沒有什么真正可說的,相信大家都能看出這個結果的。

下面看看第二個Demo:

Demo2:

復制代碼 代碼如下:

static void Main(string[] args)
{
B b = new B(); 
A a = new A();

Console.WriteLine(B.strText); 

}
public class A
{
public static string strText;
static A()
{
strText = "aaaa";  
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}


大家猜猜輸出結果是什么,可能有人認為會輸出aaaa,理由是new B()之前會調用static B(),然后new A()之前需要調用static A,這樣結果是aaaa,但是實際情況并非如果,正確的結果是bbbb,原因如下:

在執行  new B(); 之前,B類的靜態構造函數會調用,也就是會調用:
static B()
{
 strText="bbbb";
}

當執行到strText=“bbbb"的時候,這時需要訪問strText字段,而B的strText字段是從A類繼承的,所以這里需要會先調用:
static A()
{
 strText="aaaa";
}

執行這個函數以后strText的值是aaaa

然后代碼又回到static B()中,這時才執行static B()中的strText="bbbb"這行,所以strText這時的值是bbbb

當執行A a=new A();的時候,不會在調用A的靜態構造函數了,因為前面已經調用過了,靜態函數在整個應用程序域的生命周期中只會調用一次!

請大家多指教啊!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 耒阳市| 离岛区| 新泰市| 故城县| 汽车| 北京市| 手游| 汉川市| 左贡县| 塔河县| 田东县| 庆安县| 北海市| 尤溪县| 海安县| 富锦市| 广南县| 颍上县| 稻城县| 四子王旗| 偏关县| 塔城市| 涞水县| 菏泽市| 凤冈县| 东乡族自治县| 灯塔市| 阳西县| 永登县| 马尔康县| 修文县| 东海县| 东光县| 资阳市| 沾化县| 门头沟区| 会同县| 于田县| 松江区| 清丰县| 奉新县|