日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.Net的类型构造器-static构造函数

發(fā)布時(shí)間:2025/3/15 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net的类型构造器-static构造函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
.Net的類(lèi)型構(gòu)造器-static構(gòu)造函數(shù)

品味細(xì)節(jié),深入.NET的類(lèi)型構(gòu)造器

轉(zhuǎn)載自:http://msdn.microsoft.com/zh-cn/dd368012.aspx

?

1 引言

今天Artech 兄在《關(guān)于 Type Initializer和 BeforeFieldInit的問(wèn)題,看看大家能否給出正確的解釋 》一文中讓我們認(rèn)識(shí)了一個(gè)關(guān)于類(lèi)型構(gòu)造器調(diào)用執(zhí)行的有趣示例,其中也相應(yīng)提出了一些關(guān)于beforefieldinit 對(duì)于類(lèi)型構(gòu)造器調(diào)用時(shí)機(jī)的探討,對(duì)于我們很好的理解類(lèi)型構(gòu)造器給出了一個(gè)很好的應(yīng)用實(shí)踐體驗(yàn)。
作為補(bǔ)充,本文希望從基礎(chǔ)開(kāi)始再層層深入,把《關(guān)于Type Initializer 和 BeforeFieldInit 的問(wèn)題,看看大家能否給出正確的解釋》一文中沒(méi)有解釋的概念和原理,進(jìn)行必要的補(bǔ)充,例如更全面的認(rèn)識(shí)類(lèi)型構(gòu)造器,認(rèn)識(shí)BeforeFieldInit 。并在此基礎(chǔ)上,探討一點(diǎn)關(guān)于類(lèi)型構(gòu)造器的實(shí)踐應(yīng)用,同時(shí)期望能夠回答其中示例運(yùn)行的結(jié)果。
廢話少說(shuō),我們開(kāi)始。

2 認(rèn)識(shí)對(duì)象構(gòu)造器和類(lèi)型構(gòu)造器

在.NET 中,一個(gè)類(lèi)的初始化過(guò)程是在構(gòu)造器中進(jìn)行的。并且根據(jù)構(gòu)造成員的類(lèi)型,分為類(lèi)型構(gòu)造器(.cctor )和對(duì)象構(gòu)造器(.ctor ), 其中.cctor 和.ctor 為二者在IL 代碼中的指令表示。.cctor 不能被直接調(diào)用,其調(diào)用規(guī)則正是本文欲加闡述的重點(diǎn),詳見(jiàn)后文的分析;而.ctor 會(huì)在類(lèi)型實(shí)例化時(shí)被自動(dòng)調(diào)用。
基于對(duì)類(lèi)型構(gòu)造器的探討,我們有必要首先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類(lèi)定義,其中包括普通的構(gòu)造器和靜態(tài)構(gòu)造器,例如

  • //?Release?:?code01,?2008/11/02????????????????
  • ????//?Author??:?Anytao,?http://www.anytao.com?
  • ????public?class?User
  • ????{
  • ????????static?User()
  • ????????{
  • ????????????message?=?"Initialize?in?static?constructor.";
  • ????????}
  • ?
  • ????????public?User()
  • ????????{
  • ????????????message?=?"Initialize?in?normal?construcotr.";
  • ????????}
  • ?
  • ????????public?User(string?name,?int?age)
  • ????????{
  • ????????????Name?=?name;
  • ????????????Age?=?age;
  • ????????}
  • ?
  • ????????public?string?Name?{?get;?set;?}
  • ?
  • ????????public?int?Age?{?get;?set;?}
  • ?
  • ????????public?static?string?message?=?"Initialize?when?defined.";
  • 我們將上述代碼使用ILDasm.exe 工具反編譯為IL 代碼,可以很方便的找到相應(yīng)的類(lèi)型構(gòu)造器和對(duì)象構(gòu)造器的影子,如圖

    然后,我們簡(jiǎn)單的來(lái)了解一下對(duì)象構(gòu)造器和類(lèi)型構(gòu)造器的概念。

    • 對(duì)象構(gòu)造器(.ctor )

    在生成的IL 代碼中將可以看到對(duì)應(yīng)的ctor ,類(lèi)型實(shí)例化時(shí)會(huì)執(zhí)行對(duì)應(yīng)的構(gòu)造器進(jìn)行類(lèi)型初始化的操作。

    • 類(lèi)型構(gòu)造器(.cctor )

    用于執(zhí)行對(duì)靜態(tài)成員的初始化,在.NET 中,類(lèi)型在兩種情況下會(huì)發(fā)生對(duì).cctor 的調(diào)用:

      1. 為靜態(tài)成員指定初始值,例如上例中只有靜態(tài)成員初始化,而沒(méi)有靜態(tài)構(gòu)造函數(shù)時(shí),.cctor 的IL 代碼實(shí)現(xiàn)為:

  • .method?private?hidebysig?specialname?rtspecialname?static?
  • ????????void??.cctor()?cil?managed
  • {
  • ??//?Code?size???????11?(0xb)
  • ??.maxstack??8
  • ??IL_0000:??ldstr??????"Initialize?when?defined."
  • ??IL_0005:??stsfld?????string?Anytao.Write.TypeInit.User::message
  • ??IL_000a:??ret
  • }?//?end?of?method?User::.cctor
  •   2. 實(shí)現(xiàn)顯式的靜態(tài)構(gòu)造函數(shù),例如上例中有靜態(tài)構(gòu)造函數(shù)存在時(shí),將首先執(zhí)行靜態(tài)成員的初始化過(guò)程,再執(zhí)行靜態(tài)構(gòu)造函數(shù)初始化過(guò)程,.cctor 的IL 代碼實(shí)現(xiàn)為:

  • .method?private?hidebysig?specialname?rtspecialname?static?
  • ????????void??.cctor()?cil?managed
  • {
  • ??//?Code?size???????23?(0x17)
  • ??.maxstack??8
  • ??IL_0000:??ldstr??????"Initialize?when?defined."
  • ??IL_0005:??stsfld?????string?Anytao.Write.TypeInit.User::message
  • ??IL_000a:??nop
  • ??IL_000b:??ldstr??????"Initialize?in?static?constructor."
  • ??IL_0010:??stsfld?????string?Anytao.Write.TypeInit.User::message
  • ??IL_0015:??nop
  • ??IL_0016:??ret
  • }?//?end?of?method?User::.cctor
  • 同時(shí),我們必須明確一些靜態(tài)構(gòu)造函數(shù)的基本規(guī)則,包括:

    • 必須為靜態(tài)無(wú)參構(gòu)造函數(shù),并且一個(gè)類(lèi)只能有一個(gè)。
    • 只能對(duì)靜態(tài)成員進(jìn)行初始化。
    • 靜態(tài)無(wú)參構(gòu)造函數(shù)可以和非靜態(tài)無(wú)參構(gòu)造函數(shù)共存,區(qū)別在于二者的執(zhí)行時(shí)間,詳見(jiàn)《你必須知道的.NET 》7.8 節(jié) “ 動(dòng)靜之間:靜態(tài)和非靜態(tài)” 的論述,其他更多的區(qū)別和差異也詳見(jiàn)本節(jié)的描述。

    3 深入執(zhí)行過(guò)程

    因?yàn)轭?lèi)型構(gòu)造器本身的特點(diǎn),在一定程度上決定了.cctor 的調(diào)用時(shí)機(jī)并非是一個(gè)確定的概念。因?yàn)轭?lèi)型構(gòu)造器都是private 的,用戶不能顯式調(diào)用類(lèi)型構(gòu)造器。所以關(guān)于類(lèi)型構(gòu)造器的執(zhí)行時(shí)機(jī)問(wèn)題在.NET 中主要包括兩種方案:

    • precise 方式
    • beforefieldinit 方式

    二者的執(zhí)行差別主要體現(xiàn)在是否為類(lèi)型實(shí)現(xiàn)了顯式的靜態(tài)構(gòu)造函數(shù),如果實(shí)現(xiàn)了顯式的靜態(tài)構(gòu)造函數(shù),則按照precise 方式執(zhí)行;如果沒(méi)有實(shí)現(xiàn)顯式的靜態(tài)構(gòu)造函數(shù),則按照beforefieldinit 方式執(zhí)行。
    為了說(shuō)清楚類(lèi)型構(gòu)造器的執(zhí)行情況,我們首先在概念上必須明確一個(gè)前提,那就是precise 的語(yǔ)義明確了.cctor 的調(diào)用和調(diào)用存取靜態(tài)成員的時(shí)機(jī)存在精確的關(guān)系,所以換句話說(shuō),類(lèi)型構(gòu)造器的執(zhí)行時(shí)機(jī)在語(yǔ)義上決定于是否顯式的聲明了靜態(tài)構(gòu)造函數(shù),以及存取靜態(tài)成員的時(shí)機(jī),這兩個(gè)因素。
    我們還是從User 類(lèi)的實(shí)現(xiàn)說(shuō)起,一一過(guò)招分析這兩種方式的執(zhí)行過(guò)程。
    3.1 precise 方式
    首先實(shí)現(xiàn)顯式的靜態(tài)構(gòu)造函數(shù)方案,為:

  • //?Release?:?code02,?2008/11/02????????????????
  • ????//?Author??:?Anytao,?http://www.anytao.com?
  • ????public?class?User
  • ????{
  • ????????//Explicit?Constructor
  • ????????static?User()
  • ????????{
  • ????????????message?=?"Initialize?in?static?constructor.";
  • ????????}
  • ?
  • ????????public?static?string?message?=?"Initialize?when?defined.";
  • ????}
  • 對(duì)應(yīng)的IL 代碼為:

  • .class?public?auto?ansi?User
  • ????extends?[mscorlib]System.Object
  • {
  • ????.method?private?hidebysig?specialname?rtspecialname?static?void?.cctor()?cil?managed
  • ????{
  • ????????.maxstack?8
  • ????????L_0000:?ldstr?"Initialize?when?defined."
  • ????????L_0005:?stsfld?string?Anytao.Write.TypeInit.User::message
  • ????????L_000a:?nop?
  • ????????L_000b:?ldstr?"Initialize?in?static?constructor."
  • ????????L_0010:?stsfld?string?Anytao.Write.TypeInit.User::message
  • ????????L_0015:?nop?
  • ????????L_0016:?ret?
  • ????}
  • ?
  • ????.method?public?hidebysig?specialname?rtspecialname?instance?void?.ctor()?cil?managed
  • ????{
  • ????????.maxstack?8
  • ????????L_0000:?ldarg.0?
  • ????????L_0001:?call?instance?void?[mscorlib]System.Object::.ctor()
  • ????????L_0006:?ret?
  • ????}
  • ?
  • ????.field?public?static?string?message
  • }
  • 為了進(jìn)行對(duì)比分析,我們需要首先分析beforefieldinit 方式的執(zhí)行情況,所以接著繼續(xù)。。。
    3.2 beforefieldinit 方式
    為User 類(lèi)型,不實(shí)現(xiàn)顯式的靜態(tài)構(gòu)造函數(shù)方案,為:

  • //?Release?:?code03,?2008/11/02????????????????
  • ????//?Author??:?Anytao,?http://www.anytao.com?
  • ????public?class?User
  • ????{
  • ????????//Implicit?Constructor
  • ????????public?static?string?message?=?"Initialize?when?defined.";
  • ????}
  • 對(duì)應(yīng)的IL代碼為:
  • .class?public?auto?ansi?beforefieldinit?User
  • ????extends?[mscorlib]System.Object
  • {
  • ????.method?private?hidebysig?specialname?rtspecialname?static?void?.cctor()?cil?managed
  • ????{
  • ????????.maxstack?8
  • ????????L_0000:?ldstr?"Initialize?when?defined."
  • ????????L_0005:?stsfld?string?Anytao.Write.TypeInit.User::message
  • ????????L_000a:?ret?
  • ????}
  • ?
  • ????.method?public?hidebysig?specialname?rtspecialname?instance?void?.ctor()?cil?managed
  • ????{
  • ????????.maxstack?8
  • ????????L_0000:?ldarg.0?
  • ????????L_0001:?call?instance?void?[mscorlib]System.Object::.ctor()
  • ????????L_0006:?ret?
  • ????}
  • ?
  • ????.field?public?static?string?message
  • }
  • 3.3 分析差別
    從IL 代碼的執(zhí)行過(guò)程而言,我們首先可以了解的是在顯式和隱式實(shí)現(xiàn)類(lèi)型構(gòu)造函數(shù)的內(nèi)部,除了添加新的初始化操作之外,二者的實(shí)現(xiàn)是基本相同的。所以要找出兩種方式的差別,我們最終將著眼點(diǎn)鎖定在二者元數(shù)據(jù)的聲明上,隱式方式多了一個(gè)稱(chēng)為beforefieldinit 標(biāo)記的指令。
    那么,beforefieldinit 究竟表示什么樣的語(yǔ)義呢?Scott Allen 對(duì)此進(jìn)行了詳細(xì)的解釋:beforefieldinit 為CLR 提供了在任何時(shí)候執(zhí)行.cctor 的授權(quán),只要該方法在第一次訪問(wèn)類(lèi)型的靜態(tài)字段之前執(zhí)行即可
    所以,如果對(duì)precise 方式和beforefieldinit 方式進(jìn)行比較時(shí),二者的差別就在于是否在元數(shù)據(jù)聲明時(shí)標(biāo)記了beforefieldinit 指令。precise 方式下,CLR 必須在第一次訪問(wèn)該類(lèi)型的靜態(tài)成員或者實(shí)例成員之前執(zhí)行類(lèi)型構(gòu)造器,也就是說(shuō)必須剛好在存取靜態(tài)成員或者創(chuàng)建實(shí)例成員之前完成類(lèi)型構(gòu)造器的調(diào)用;beforefieldinit 方式下,CLR 可以在任何時(shí)候執(zhí)行類(lèi)型構(gòu)造器,一定程度上實(shí)現(xiàn)了對(duì)執(zhí)行性能的優(yōu)化,因此較precise 方式更加高效。
    值得注意的是,當(dāng)有多個(gè)beforefieldinit 構(gòu)造器存在時(shí),CLR 無(wú)法保證這多個(gè)構(gòu)造器之間的執(zhí)行順序,因此我們?cè)趯?shí)際的編碼時(shí)應(yīng)該盡量避免這種情況的發(fā)生。

    ?

    備注:

    假設(shè)有下面的一個(gè)類(lèi)

    class MyTest
    {
    public static int Number = 1;
    public MyTest()
    {
    Number
    ++;
    }
    }

    被下面的方法調(diào)用

    private void Test()
    {
    var t1
    = new MyTest();
    t1
    = null;
    var t2
    = new MyTest();
    }

    這里有三行代碼,下面是不同時(shí)間MyTest.Number值的變化:

    時(shí)間        MyTest.Number的值

    第一行執(zhí)行前???????????0

    第一行執(zhí)行后?????????? 2

    第二行執(zhí)行后?????????? 2(即使實(shí)例被置為null,但是靜態(tài)值還是常駐內(nèi)存的)

    第三行執(zhí)行后???????????3

    posted on 2011-08-23 17:38 cutebear 閱讀(...) 評(píng)論(...) 編輯 收藏

    轉(zhuǎn)載于:https://www.cnblogs.com/bear831204/archive/2011/08/23/2151077.html

    新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

    總結(jié)

    以上是生活随笔為你收集整理的.Net的类型构造器-static构造函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久久久免费观看 | 黄色片视频在线观看 | 91啦丨九色丨刺激 | 91吃瓜今日吃瓜入口 | 亚洲精品一区二 | 国产午夜在线观看 | 处破痛哭a√18成年片免费 | 日韩性xx | 丰满的女人性猛交 | 亚洲视频二 | 国产精品视频a | 国产夫妻精品 | 欧美中日韩在线 | 中日韩在线视频 | 日韩欧美网址 | 欧美日韩国产在线 | 亚洲一区二区免费电影 | 久久久国产免费 | 欧美黄色高清视频 | 国语对白做受欧美 | 黄色永久视频 | 久久久久久91 | 日批的视频| 日韩美女免费线视频 | 色羞羞 | 日本日皮视频 | 日韩欧美一区二区在线观看 | 先锋影音av在线 | 欧美三级三级三级爽爽爽 | 一级片欧美 | 四虎网站在线观看 | 精品无码在线视频 | 91精品国产精品 | 国产精品亚洲αv天堂无码 伊人性视频 | 久久丝袜美腿 | 欧美涩涩涩| 欧美多人猛交狂配 | 长河落日电视连续剧免费观看 | av一区二区在线播放 | 男女污视频 | 精品久久久999 | 九九视频精品在线 | 嫩草视频网站 | 超碰人人射 | 无码专区久久综合久中文字幕 | 色狠狠av | 人妻系列一区 | 亚洲色图在线观看 | 日韩黄色在线视频 | 日韩亚洲欧美一区 | 波多野结衣免费视频观看 | 亚洲精品人 | 欧美激情亚洲激情 | 极品少妇xxxx| 色妞在线 | 91爱爱影院 | 欧美a性| 公与妇乱理三级xxx www色 | 反差在线观看免费版全集完整版 | 免费中文字幕视频 | 欧洲成人一区二区三区 | 日韩av中文字幕在线 | 婷婷在线视频 | 色久天| 国产www免费 | 欧美日本免费 | 亚洲精品乱码久久久久久蜜桃麻豆 | youjizz亚洲女人 | 91嫩草香蕉 | 亚洲一区二区日韩欧美 | 亚洲人成影视 | 国产综合福利 | 免费在线观看黄网站 | 91精品久久久久久 | 亚洲欧美999 | 国产精品一二三区视频 | 日本免费三区 | 日韩激情免费 | 黄wwwww| 免费观看久久久 | 欧美一级性 | 99草在线视频 | 日韩三级在线免费观看 | 韩国av免费在线 | 日韩精品一区二区视频 | www.欧美com| 亚洲偷拍一区 | 欧美美女在线观看 | 超薄肉色丝袜一区二区 | 国产黑丝在线播放 | 国产热| 色偷偷一区二区三区 | 国产精品视频久久久久久 | 少妇免费毛片久久久久久久久 | 久久精品一区二区 | 96国产视频| 亚洲在线播放 | 青青草久久伊人 | 久久久老熟女一区二区三区91 |