最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 9.0新特性——模塊初始化器

 更新時間:2020年11月30日 08:36:46   作者:碼客風(fēng)云  
這篇文章主要介紹了c# 9.0新特性——模塊初始化器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#9.0,感興趣的朋友可以了解下

作者:MarkKang
出處:https://www.cnblogs.com/markkang/

1 背景動機(jī)

關(guān)于模塊或者程序集初始化工作一直是C#的一個痛點,微軟內(nèi)部外部都有大量的報告反應(yīng)很多客戶一直被這個問題困擾,這還不算沒有統(tǒng)計上的客戶。那么解決這個問題,還有基于什么樣的考慮呢?

  • 在庫加載的時候,能以最小的開銷、無需用戶顯式調(diào)用任何接口,使客戶做一些期望的和一次性的初始化。
  • 當(dāng)前靜態(tài)構(gòu)造函數(shù)方法的一個最大的問題是運(yùn)行時會對帶有靜態(tài)構(gòu)造函數(shù)的類型做一些額外的檢查。這是因為要決定靜態(tài)構(gòu)造函數(shù)是否需要被運(yùn)行所必須的一步,但是這個又有著顯著的開銷影響。
  • 使源代碼生成器在不需要用戶顯式調(diào)用一些東西的情況下能運(yùn)行一些全局的初始化邏輯。

2 詳細(xì)設(shè)計

C# 9.0將模塊初始化器設(shè)計為一個Attribute,用這個Attribute來修飾進(jìn)行模塊初始化邏輯的方法,就實現(xiàn)了模塊初始化功能。這個Attribute被命名為ModuleInitializerAttribute,具體定義如下:

using System;
namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
  public sealed class ModuleInitializerAttribute : Attribute { }
}

如果要使用模塊初始化器,你只要將ModuleInitializerAttribute用在符合下面要求的方法上就可以了。

  1. 該方法必須使靜態(tài)的、無參的、返回值為void的函數(shù)。
  2. 該方法不能是泛型或者包含在泛型類型里
  3. 該方法必須是可從其所在模塊里訪問的。也就是說,方法的有效訪問符必須是internal或者public,不能是局部方法。
using System.Runtime.CompilerServices;
class MyClass
{
  [ModuleInitializer]
  internal static void Initializer()
  {
    // ...
  }
}

被修飾為ModuleInitializerAttribute的靜態(tài)方法會被編譯器在編譯時,在全局的靜態(tài)構(gòu)造函數(shù)中生成此代碼調(diào)用。如果有多個被修飾為初始化器的函數(shù),則每個函數(shù)生成一個初始化器代碼調(diào)用,這些初始化器代碼調(diào)用代碼會按照一定的順序(類型名稱順序和代碼順序)生成。當(dāng)模塊在被加載時,全局靜態(tài)構(gòu)造函數(shù)開始執(zhí)行,從而完成模塊代碼初始化工作。

3 問題與最佳實踐

模塊初始化器與靜態(tài)構(gòu)造函數(shù)之間有著一定的關(guān)聯(lián)影響。因為模塊初始化器是一個靜態(tài)方法,因而其被調(diào)用執(zhí)行前,必然會引起其所處類型的靜態(tài)構(gòu)造函數(shù)的執(zhí)行。請參考下列示例:

static class ModuleInit
{
  static ModuleInit()
  {
    //先執(zhí)行
    Console.WriteLine("ModuleInit靜態(tài)構(gòu)造函數(shù) cctor");
  }

  [ModuleInitializer]
  internal static void Initializer()
  {
    //在靜態(tài)構(gòu)造函數(shù)執(zhí)行后才執(zhí)行
    Console.WriteLine("模塊初始化器");
  }
}

在一個模塊中指定多個模塊初始化器的時候,他們之間的順序也是一個值得注意的問題。以上這些問題的存在,就要求我們注意以下幾點:

在指定了模塊初始化器的類型中,不要在靜態(tài)構(gòu)造函數(shù)中,寫與模塊初始化器中代碼有著順序依賴代碼,最好的就是不要使用靜態(tài)構(gòu)造函數(shù)。

多個模塊初始化器之間的代碼,也不要有任何依賴關(guān)系,保持各個初始化器代碼的獨(dú)立性。

4 結(jié)束語

日常開發(fā)中,我們通常需要在模塊初始化的時候,做一些前置性的準(zhǔn)備工作,以前常采用靜態(tài)構(gòu)造函數(shù)這種不具有全局性方法,局限性很大,現(xiàn)在,這些都得到了完美解決。

以上就是c# 9.0新特性——模塊初始化器的詳細(xì)內(nèi)容,更多關(guān)于c# 9.0新特性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于switch你可能不知道的一些用法

    基于switch你可能不知道的一些用法

    本篇文章對switch的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C#中String.ToCharArray方法的使用

    詳解C#中String.ToCharArray方法的使用

    這篇文章主要為大家詳細(xì)介紹了C#中String.ToCharArray方法的使用的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C#實現(xiàn)鬧鐘AlarmClock實例代碼

    C#實現(xiàn)鬧鐘AlarmClock實例代碼

    這篇文章主要介紹了C#實現(xiàn)鬧鐘AlarmClock實例代碼,很實用的功能,需要的朋友可以參考下
    2014-08-08
  • C#提取PPT文本和圖片的實現(xiàn)方法

    C#提取PPT文本和圖片的實現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了C#提取PPT文本和圖片的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 探究C#訪問null字段會拋異常原因

    探究C#訪問null字段會拋異常原因

    本文主要介紹了探究C#訪問null字段會拋異常原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#使用異步流高效處理序列數(shù)據(jù)的方法詳解

    C#使用異步流高效處理序列數(shù)據(jù)的方法詳解

    C#中的異步流(Async Streams),異步流是C# 8.0引入的一個新特性,它允許你異步地處理序列數(shù)據(jù),非常適合處理大量數(shù)據(jù)或長時間運(yùn)行的任務(wù),本文給大家介紹了C#使用異步流高效處理序列數(shù)據(jù)的方法步驟,需要的朋友可以參考下
    2024-11-11
  • C#實現(xiàn)截圖幫助類

    C#實現(xiàn)截圖幫助類

    這篇文章介紹了C#實現(xiàn)截圖幫助類的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • js驗證電話號碼手機(jī)號碼的正則表達(dá)式

    js驗證電話號碼手機(jī)號碼的正則表達(dá)式

    本篇文章主要是對js驗證電話號碼手機(jī)號碼的正則表達(dá)式進(jìn)行了介紹。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • Unity3D實現(xiàn)導(dǎo)航效果

    Unity3D實現(xiàn)導(dǎo)航效果

    這篇文章主要為大家詳細(xì)介紹了Unity3D實現(xiàn)簡單導(dǎo)航效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • c# 用ffmpeg從視頻中截圖

    c# 用ffmpeg從視頻中截圖

    這篇文章主要介紹了c# 用ffmpeg從視頻中截圖的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評論

嘉峪关市| 西林县| 静海县| 庆云县| 长武县| 瑞安市| 汝南县| 兴安县| 梁河县| 新民市| 昌黎县| 湟源县| 六枝特区| 哈巴河县| 萨嘎县| 姜堰市| 保定市| 肃宁县| 定西市| 新晃| 中卫市| 枞阳县| 久治县| 西青区| 新建县| 伊春市| 栾城县| 安庆市| 华池县| 西和县| 南川市| 庆元县| 宁阳县| 和龙市| 金阳县| 道孚县| 白沙| 布尔津县| 富顺县| 惠来县| 靖边县|