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

C#中靜態(tài)構造函數(shù)的幾點說明介紹

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

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

復制代碼 代碼如下:

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

在使用靜態(tài)構造函數(shù)的時候應該注意幾點:

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

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

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

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

5、最多只運行一次。

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

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

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

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

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

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

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

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類的靜態(tài)構造函數(shù)static B()。實際上輸出的結果是aaaa,因為strText是類A的靜態(tài)字段,而類B只是繼承了這個字段,所以這里會調用類A的靜態(tài)構造函數(shù)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,原因如下:

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

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

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

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

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

請大家多指教??!

相關文章

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

    C#圖像偽彩色處理方法

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

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

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

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

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

    深入理解C#窗體關閉事件

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

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

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

    c# WPF中的TreeView使用詳解

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

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

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

    運用示例簡單講解C#取消令牌CancellationTokenSource

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

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

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

    無焦點獲取條碼槍返回值示例

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

最新評論