欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中靜態(tài)構(gòu)造函數(shù)的幾點(diǎn)說(shuō)明介紹

 更新時(shí)間:2014年01月17日 10:04:39   作者:  
本篇文章主要是對(duì)C#中靜態(tài)構(gòu)造函數(shù)的幾點(diǎn)說(shuō)明進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助

靜態(tài)構(gòu)造函數(shù)是C#的一個(gè)新特性,其實(shí)好像很少用到。不過(guò)當(dāng)我們想初始化一些靜態(tài)變量的時(shí)候就需要用到它了。這個(gè)構(gòu)造函數(shù)是屬于類的,而不是屬于哪里實(shí)例的,就是說(shuō)這個(gè)構(gòu)造函數(shù)只會(huì)被執(zhí)行一次。也就是在創(chuàng)建第一個(gè)實(shí)例或引用任何靜態(tài)成員之前,由.NET自動(dòng)調(diào)用。

復(fù)制代碼 代碼如下:

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

在使用靜態(tài)構(gòu)造函數(shù)的時(shí)候應(yīng)該注意幾點(diǎn):

1、靜態(tài)構(gòu)造函數(shù)既沒(méi)有訪問(wèn)修飾符,也沒(méi)有參數(shù)。因?yàn)槭?NET調(diào)用的,所以像public和private等修飾符就沒(méi)有意義了。

2、是在創(chuàng)建第一個(gè)類實(shí)例或任何靜態(tài)成員被引用時(shí),.NET將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)來(lái)初始化類,也就是說(shuō)我們無(wú)法直接調(diào)用靜態(tài)構(gòu)造函數(shù),也就無(wú)法控制什么時(shí)候執(zhí)行靜態(tài)構(gòu)造函數(shù)了。

3、一個(gè)類只能有一個(gè)靜態(tài)構(gòu)造函數(shù)。

4、無(wú)參數(shù)的構(gòu)造函數(shù)可以與靜態(tài)構(gòu)造函數(shù)共存。盡管參數(shù)列表相同,但一個(gè)屬于類,一個(gè)屬于實(shí)例,所以不會(huì)沖突。

5、最多只運(yùn)行一次。

6、靜態(tài)構(gòu)造函數(shù)不可以被繼承。

7、如果沒(méi)有寫(xiě)靜態(tài)構(gòu)造函數(shù),而類中包含帶有初始值設(shè)定的靜態(tài)成員,那么編譯器會(huì)自動(dòng)生成默認(rèn)的靜態(tài)構(gòu)造函數(shù)。
 

靜態(tài)構(gòu)造函數(shù)趣談!
類的靜態(tài)構(gòu)造函數(shù)也叫類型構(gòu)造器,靜態(tài)構(gòu)造器,他調(diào)用的時(shí)刻由CLR來(lái)控制:

CLR會(huì)選擇如下時(shí)間之一來(lái)調(diào)用靜態(tài)構(gòu)造函數(shù):
 1,在類型的第一個(gè)實(shí)例創(chuàng)建之前,或類型的非繼承字段或成員第一次訪問(wèn)之前。這里的“之前”,代表前后銜接的意思。這里的時(shí)刻是精確的!

 2,在非繼承的靜態(tài)字段或成員第一次訪問(wèn)之前的某個(gè)時(shí)刻,具體時(shí)刻不定!

由于調(diào)用的時(shí)刻不確定,所以我們最好不要編寫(xiě)依賴于特定的靜態(tài)構(gòu)造函數(shù)的執(zhí)行順序的代碼,這樣很容易產(chǎn)生不可預(yù)料的后果!

下面大家看看以下的Demo,我們來(lái)更加深入的看看靜態(tài)構(gòu)造函數(shù)的一些有趣的行為:

Demo1:

復(fù)制代碼 代碼如下:

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";  
}
}

大家猜猜結(jié)果是什么,可能有人認(rèn)為輸出的是bbbb,因?yàn)樵L問(wèn)B.strText需要調(diào)用B類的靜態(tài)構(gòu)造函數(shù)static B()。實(shí)際上輸出的結(jié)果是aaaa,因?yàn)閟trText是類A的靜態(tài)字段,而類B只是繼承了這個(gè)字段,所以這里會(huì)調(diào)用類A的靜態(tài)構(gòu)造函數(shù)static A(),所以輸出結(jié)果是aaaa。這也沒(méi)有什么真正可說(shuō)的,相信大家都能看出這個(gè)結(jié)果的。

下面看看第二個(gè)Demo:

Demo2:

復(fù)制代碼 代碼如下:

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";  
}
}


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

在執(zhí)行  new B(); 之前,B類的靜態(tài)構(gòu)造函數(shù)會(huì)調(diào)用,也就是會(huì)調(diào)用:
static B()
{
 strText="bbbb";
}

當(dāng)執(zhí)行到strText=“bbbb"的時(shí)候,這時(shí)需要訪問(wèn)strText字段,而B(niǎo)的strText字段是從A類繼承的,所以這里需要會(huì)先調(diào)用:
static A()
{
 strText="aaaa";
}

執(zhí)行這個(gè)函數(shù)以后strText的值是aaaa

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

當(dāng)執(zhí)行A a=new A();的時(shí)候,不會(huì)在調(diào)用A的靜態(tài)構(gòu)造函數(shù)了,因?yàn)榍懊嬉呀?jīng)調(diào)用過(guò)了,靜態(tài)函數(shù)在整個(gè)應(yīng)用程序域的生命周期中只會(huì)調(diào)用一次!

請(qǐng)大家多指教啊!

相關(guān)文章

  • C#圖像偽彩色處理方法

    C#圖像偽彩色處理方法

    這篇文章主要介紹了C#圖像偽彩色處理方法,涉及C#操作圖像的偽彩色相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)文件Move和Copy操作

    C#實(shí)現(xiàn)文件Move和Copy操作

    這篇文章介紹了C#實(shí)現(xiàn)文件Move和Copy操作的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • c# 死鎖和活鎖的發(fā)生及避免

    c# 死鎖和活鎖的發(fā)生及避免

    多線程編程時(shí),如果涉及同時(shí)讀寫(xiě)共享數(shù)據(jù),就要格外小心。如果共享數(shù)據(jù)是獨(dú)占資源,則要對(duì)共享數(shù)據(jù)的讀寫(xiě)進(jìn)行排它訪問(wèn),最簡(jiǎn)單的方式就是加鎖。鎖也不能隨便用,否則可能會(huì)造成死鎖和活鎖。本文將通過(guò)示例詳細(xì)講解死鎖和活鎖是如何發(fā)生的以及如何避免它們。
    2020-11-11
  • 深入理解C#窗體關(guān)閉事件

    深入理解C#窗體關(guān)閉事件

    很多初學(xué)者都想把默認(rèn)的C#關(guān)閉按鈕事件弄明白,本文就介紹一下C#窗體關(guān)閉事件,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • WPF實(shí)現(xiàn)時(shí)鐘特效

    WPF實(shí)現(xiàn)時(shí)鐘特效

    這篇文章主要介紹了WPF實(shí)現(xiàn)時(shí)鐘特效,過(guò)程很簡(jiǎn)單,感興趣的小伙伴們可以參考一下
    2015-11-11
  • c# WPF中的TreeView使用詳解

    c# WPF中的TreeView使用詳解

    這篇文章主要介紹了c# WPF中的TreeView使用詳解,幫助大家更好的理解和學(xué)習(xí)使用c#技術(shù),感興趣的朋友可以了解下
    2021-03-03
  • 深入Ref,Out的理解及其使用

    深入Ref,Out的理解及其使用

    本篇文章是對(duì)Ref與Out進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 運(yùn)用示例簡(jiǎn)單講解C#取消令牌CancellationTokenSource

    運(yùn)用示例簡(jiǎn)單講解C#取消令牌CancellationTokenSource

    這篇文章運(yùn)用示例簡(jiǎn)單講解C#取消令牌CancellationTokenSource,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#中Try-Catch語(yǔ)句真的影響程序性能嗎?

    C#中Try-Catch語(yǔ)句真的影響程序性能嗎?

    這篇文章主要介紹了C#中Try-Catch語(yǔ)句真的影響程序性能嗎?本文結(jié)合IL分析Try-Catch語(yǔ)句的性能問(wèn)題,需要的朋友可以參考下
    2015-06-06
  • 無(wú)焦點(diǎn)獲取條碼槍返回值示例

    無(wú)焦點(diǎn)獲取條碼槍返回值示例

    這篇文章主要介紹了使用C#獲取條碼槍的返回值,實(shí)現(xiàn)了獲取條碼信息、條碼是否有效、掃描時(shí)間、掃描碼等參數(shù)
    2014-01-01

最新評(píng)論