首頁  >  文章  >  後端開發  >  C#中的靜態建構函數有什麼用途?

C#中的靜態建構函數有什麼用途?

WBOY
WBOY轉載
2023-08-23 22:25:02822瀏覽

C#中的靜態建構函數有什麼用途?

靜態建構子用於初始化任何靜態數據,或執行特定的操作 需要翻譯的內容為:在首次呼叫之前自動執行的操作 實例被建立或任何靜態成員被引用時。

當為非託管程式碼建立包裝類別時,靜態建構子非常有用, 當建構函式可以呼叫LoadLibrary方法時。靜態建構函數也是如此 方便的地方來對無法進行運行時檢查的類型參數進行強制執行 在編譯時透過約束條件進行檢查。

靜態建構子具有以下屬性 −

  • 靜態建構子不接受存取修飾符或參數。

  • 一個類別或結構體只能有一個靜態建構子。

  • 靜態建構子不能被繼承或重載。

  • 靜態建構子不能直接調用,只能透過其他方法調用

# 公共語言運行時(CLR)。它會自動呼叫。
  • 使用者無法控制靜態建構子何時執行 程式.

  • 靜態建構子在初始化類別之前自動調用 第一個實例被建立或引用任何靜態成員。一個靜態 建構函式將在實例建構函式之前運行。類型的靜態建構函數 當靜態方法分配給事件或委託並被呼叫時稱為 並且不是在被分配時。如果靜態字段變數初始化器存在於中 class of the static constructor, they will be executed in the textual order in 靜態建構函數的類,它們將按照文字順序執行 在執行之前,它們出現在類別聲明中 如果您不提供靜態建構函數來初始化靜態字段,則所有靜態字段將在首次訪問時按照其聲明順序自動初始化。

  • 字段被初始化為它們在C#中預設值中列出的值 如果靜態建構函數拋出異常,運行時將不會呼叫它 第二次,而且類型將在其生命週期內保持未初始化狀態 您的程式運行的應用程式網域。最常見的情況是,一個 TypeInitializationException異常在靜態建構子被拋出時發生 無法實例化類型或在發生未處理的異常時 靜態建構函數。對於未明確定義的隱式靜態建構函數 在原始碼中定義,故障排除可能需要檢查 中間語言(IL)代碼。
  • 存在靜態建構子會阻止添加 BeforeFieldInit類型屬性。這限制了運行時優化。

  • 一個宣告為static readonly的欄位只能作為其的一部分進行賦值 在宣告或靜態建構函數中。當沒有明確的靜態建構函數時 需要翻譯的內容為:required, initialize static fields at declaration, rather than through a static 需要翻譯的內容為:required, initialize static fields at declaration, rather than through a static 構造函數用於更好的運行時最佳化。

  • 範例

     即時示範

    using System;
    namespace DemoApplication{
       public class Program{
          static void Main(string[] args){
             Car user = new Car();
             Car user1 = new Car();
             Console.ReadLine();
          }
       }
       public class Car{
          static Car(){
             Console.WriteLine("Static constructor called");
          }
          public Car(){
             Console.WriteLine("Default constructor called");
          }
       }
    }

    #輸出

    Static constructor called
    Default constructor called
    Default constructor called

    在上面的範例中,我們可以看到靜態建構子只被調用一次。

    範例

     線上示範

    using System;
    using System.Threading;
    namespace DemoApplication{
       public class Car{
          protected static readonly DateTime globalStartTime;
          protected int RouteNumber { get; set; }
          static Car(){
             globalStartTime = DateTime.Now;
             Console.WriteLine($"Static constructor called. Global start time:
             {globalStartTime.ToLongTimeString()}");
          }
          public Car(int routeNum){
             RouteNumber = routeNum;
             Console.WriteLine($"Car {RouteNumber} is created.");
          }
          public void Drive(){
             TimeSpan elapsedTime = DateTime.Now - globalStartTime;
             Console.WriteLine($"Car {this.RouteNumber} is starting its route
             {elapsedTime.Milliseconds} minutes after global start time
             {globalStartTime.ToShortTimeString()}.");
          }
       }
       class TestCar{
          static void Main(){
             Car car1 = new Car(1);
             Car car2 = new Car(2);
             car1.Drive();
             Thread.Sleep(25);
             car2.Drive();
             Console.ReadLine();
          }
       }
    }

    輸出

    Static constructor called. Global start time:
    7:09:06 AM
    Car 1 is created.
    Car 2 is created.
    Car 1 is starting its route25 minutes after global start time7:09 AM.
    Car 2 is starting its route50 minutes after global start time7:09 AM.

    以上是C#中的靜態建構函數有什麼用途?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除