首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 靜態建構函數與靜態欄位初始化順序:同一 .cs 檔多類別載入時機分析

     編輯:程式設計綜合問答

三個 sealed 類別 (SingletonCounter, Test, Singleton) 定義於同一 Program.cs,Main 首行存取 Singleton.Instance,卻發現中斷點先觸發於 SingletonCounter 的靜態欄位。

原因

  • C# **類別載入觸發時機**:首次存取該類別的任何靜態成員、或建立實例時。
  • 同一組件內,若程式碼對多個類別有靜態存取 (即使在 Main 第一行),**JIT 編譯階段**可能一次解析整個模組的靜態欄位初始化器,導致看似「亂序」觸發。
  • Singleton 擁有**靜態建構函數** (static Singleton()),會強制該類別在**首次靜態存取前**完成初始化,但不影響其他類別。

驗證建議

  1. 將三類別分置於**不同 .cs 檔**,觀察載入順序是否符合程式碼存取順序。
  2. 在 Main 最開頭插入 System.Console.WriteLine("Start"); 確保執行進入點再逐行觀察。

核心規則

  • 靜態欄位初始化器按**文字順序**執行 (同一類別內)。
  • 靜態建構函數在該類別**首次靜態存取前**執行,且僅執行一次。
  • 跨類別初始化順序**不保證**,除非有明確相依存取。

理解「模組載入」與「類別載入」兩層次機制,即可預測靜態初始化行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved