亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間: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 背景動(dòng)機(jī)

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

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

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

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

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

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

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

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

3 問(wèn)題與最佳實(shí)踐

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

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("模塊初始化器");
  }
}

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

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

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

4 結(jié)束語(yǔ)

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

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

相關(guān)文章

  • C#使用ScrapySharp實(shí)現(xiàn)多線(xiàn)程下載操作

    C#使用ScrapySharp實(shí)現(xiàn)多線(xiàn)程下載操作

    在現(xiàn)代互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)抓取是一個(gè)常見(jiàn)的需求,無(wú)論是為了數(shù)據(jù)分析、內(nèi)容聚合還是自動(dòng)化測(cè)試,ScrapySharp 是一個(gè)基于 .NET 的輕量級(jí)、高性能的網(wǎng)頁(yè)抓取庫(kù),本文將探討如何在 C# 中使用 ScrapySharp 實(shí)現(xiàn)多線(xiàn)程下載策略,需要的朋友可以參考下
    2024-08-08
  • C#基于Mongo的官方驅(qū)動(dòng)手?jǐn)]一個(gè)Super簡(jiǎn)易版MongoDB-ORM框架

    C#基于Mongo的官方驅(qū)動(dòng)手?jǐn)]一個(gè)Super簡(jiǎn)易版MongoDB-ORM框架

    本文給大家分享C#基于Mongo的官方驅(qū)動(dòng)手?jǐn)]一個(gè)簡(jiǎn)易版MongoDB-ORM框架,是一款屬于super簡(jiǎn)易版的,通過(guò)圖文的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-05-05
  • C#同步、異步遠(yuǎn)程下載文件實(shí)例

    C#同步、異步遠(yuǎn)程下載文件實(shí)例

    使用C#下載一個(gè)Internet上的文件主要是依靠HttpWebRequest/HttpWebResonse和WebClient。具體處理起來(lái)還有同步和異步兩種方式,所以我們其實(shí)有四種組合
    2014-04-04
  • C#之lock的使用及說(shuō)明

    C#之lock的使用及說(shuō)明

    這篇文章主要介紹了C#之lock的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C#連接SQL數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)功能的操作技巧

    C#連接SQL數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)功能的操作技巧

    本文給大家分享C#連接SQL數(shù)據(jù)庫(kù)和查詢(xún)數(shù)據(jù)功能的操作技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-05-05
  • c#常用表格控件dataGridView的分頁(yè)顯示

    c#常用表格控件dataGridView的分頁(yè)顯示

    最近項(xiàng)目需要自己寫(xiě)了一個(gè)用來(lái)給DataGridView分頁(yè)用的控件,下面這篇文章主要給大家介紹了關(guān)于c#常用表格控件dataGridView的分頁(yè)顯示,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • C# RSA分段加解密實(shí)現(xiàn)方法詳解

    C# RSA分段加解密實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C# RSA分段加解密實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了C# RSA加密解密的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • C# 解決在Dictionary中使用枚舉的效率問(wèn)題

    C# 解決在Dictionary中使用枚舉的效率問(wèn)題

    這篇文章主要介紹了C# 解決在Dictionary中使用枚舉的效率問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • C#將PPT文件轉(zhuǎn)換成PDF文件

    C#將PPT文件轉(zhuǎn)換成PDF文件

    今天小編就為大家分享一篇關(guān)于C#將PPT文件轉(zhuǎn)換成PDF文件,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解

    WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-11-11

最新評(píng)論