中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CLR Via C#調用靜態構造函數是什么

發布時間:2021-12-01 09:55:41 來源:億速云 閱讀:145 作者:iii 欄目:編程語言

本篇內容主要講解“CLR Via C#調用靜態構造函數是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“CLR Via C#調用靜態構造函數是什么”吧!

CLR Via C#總結:
1 靜態構造函數是私有的(private) ,而且不能人為去修改訪問修飾符。
2 靜態構造函數不應該去調用基類的靜態構造函數,因為靜態字段不會被繼承到子類。
3 靜態構造函數在一個類型中有且僅有一個,并且是無參的。
4 靜態構造函數中只能初始化靜態字段。

從上面的4點可以知道靜態構造函數都是private的,所以不能顯示區進行調用,關于JIT何時會去生成調用靜態構造函數的代碼。存在著兩種說法。通常被稱為Precise和BeforeFieldInit。Precise方式JIT編譯器生成調用的時機:***創建類型的代碼之前;訪問類的非繼承字段或成員代碼之前。BeforeFieldInit方式JIT編譯器生成調用的時機:在訪問費繼承靜態字段代碼之前。

這兩種方式的主要區別就是選擇調用靜態構造函數的時機是否是確定的,Precise方式CLR會在確定的時刻調用靜態構造函數,而BeforeFieldInit方式CLR可以自由選擇調用靜態構造函數的時機,利用這一點,CLR可以根據類型是否在程序域中加載來選擇靜態構造函數的調用次數,以便能生成執行更快的代碼。

下面來看來個類分別展現了這兩種方式

public class UserPrecise  {  public static string _name = "內聯賦值:oec2003";  static UserPrecise()  {  _name = "構造函數賦值:oec2003";  }  }  public class UserBeforeFieldInit  {  public static string _name = "內聯賦值:oec2003";  }

通過IL代碼可以看出在UserBeforeFieldInit 的元數據上有BeforeFieldInit的標記,如下圖:

  CLR Via C#調用靜態構造函數是什么

既然上面提到BeforeFieldInit方式CLR可以選擇調用構造函數的次數從而來生成執行更快的代碼,下面就寫一段測試代碼來看看究竟怎樣。

public sealed class Program  {  static void Main(string[] args)  {  const Int32 iterations = 1000 * 1000 * 1000;  Test1(iterations);  Test2(iterations);  }  private static void Test1(Int32 iterations)  {  Stopwatch sw = Stopwatch.StartNew();  for (Int32 i = 0; i < iterations; i++)  {  UserBeforeFieldInit._name = "oec2003";  }  Console.WriteLine("Test1-UserBeforeFieldInit 用時:" + sw.Elapsed);  sw = Stopwatch.StartNew();  for (Int32 j = 0; j < iterations; j++)  {  UserPrecise._name = "oec2003";  }  Console.WriteLine("Test1-UserPrecise 用時:" + sw.Elapsed);  }  private static void Test2(Int32 iterations)  {  Stopwatch sw = Stopwatch.StartNew();  for (Int32 i = 0; i < iterations; i++)  {  UserBeforeFieldInit._name = "oec2003";  }  Console.WriteLine("Test2-UserBeforeFieldInit 用時:" + sw.Elapsed);  sw = Stopwatch.StartNew();  for (Int32 j = 0; j < iterations; j++)  {  UserPrecise._name = "oec2003";  }  Console.WriteLine("Test2-UserPrecise 用時:" + sw.Elapsed);  }  }  public class UserBeforeFieldInit  {  public static string _name;  }  public class UserPrecise  {  public static string _name ;  static UserPrecise()  {  _name = "oec2003";  }  }

CLR Via C#調用靜態構造函數測試結果如下:

 CLR Via C#調用靜態構造函數是什么

從上面CLR Via C#調用靜態構造函數結果來看,BeforeFieldInit方式的執行速度還是要快很多,但為什么第二次執行時,兩種方式的速度差不多呢?因為經過***次執行后JIT編譯器知道類型的構造器已經被調用了,所以第二次執行時不會顯示對構造函數進行調用。

到此,相信大家對“CLR Via C#調用靜態構造函數是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涟水县| 洞口县| 淮滨县| 富宁县| 米林县| 新津县| 砀山县| 南投县| 邵阳市| 襄汾县| 东光县| 湾仔区| 宁化县| 万山特区| 孝义市| 长沙市| 环江| 本溪| 新宾| 曲松县| 沙河市| 台安县| 万年县| 松溪县| 阳高县| 枣阳市| 宁波市| 永清县| 洛川县| 广宁县| 嫩江县| 辽宁省| 南川市| 福安市| 克东县| 当雄县| 兰溪市| 镇雄县| 诸暨市| 西安市| 碌曲县|