首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 欄位初始化機制:預設值、靜態與實例建構時序詳解

     編輯:關於C#

C# 保證變數永遠有預設值

不同於 C/C++,C# 編譯器會為所有未明確初始化的欄位自動指派預設值,消除未初始化變數導致的未定義行為。

各型別預設值對照表

分類型別預設值
整數sbyte, byte, short, ushort, int, uint, long, ulong0
char'\0' (U+0000)
浮點數float0.0f
double0.0d
decimal0.0m
布林boolfalse
列舉enum0 (對應基礎型別零值)
參考型別class, interface, delegate, array, stringnull
struct各欄位遞迴預設值

初始化時序:靜態 vs 實例

class Demo {
    // 靜態欄位:類別載入時初始化 (before first access)
    static int _staticField = ComputeStatic();
    static int _anotherStatic = _staticField + 1; // 可參考前面靜態欄位

    // 實例欄位:每次 new 時初始化 (建構子執行前)
    int _instanceField = ComputeInstance();
    int _anotherInstance = _instanceField + 1; // 可參考前面實例欄位

    // 建構子參數不可直接參考其他實例欄位 (尚未初始化)
    // int _illegal = _instanceField + 1; // 編譯錯誤 CS0236
}

靜態建構子與靜態欄位初始化順序

  1. 依原始碼順序執行靜態欄位初始化運算式。
  2. 執行靜態建構子 (static Demo())。
  3. 類別首次被存取前完成 (精確時機由 CLR 決定,beforefieldinit 標記影響)。

實例建構時序

  1. 衍生類別建構子呼叫 base() (隱含或顯式)。
  2. 基類別實例欄位初始化運算式 (依宣告順序)。
  3. 基類別建構子本體執行。
  4. 依此遞迴至最衍生類別。
  5. 最衍生類別實例欄位初始化運算式。
  6. 最衍生類別建構子本體執行。

常見陷阱與解決方案

陷阱原因解決
實例欄位初始化運算式參考 this 或其他實例成員欄位初始化在建構子之前,this 尚不可用移至建構子本體初始化
靜態欄位相互參考導致循環依賴初始化順序固定,後宣告者可見前宣告者重構邏輯,或使用靜態建構子集中初始化
預設值非預期業務語意 (如 0 代表無效 ID)零值可能為合法業務值使用 Nullable<T> 或自訂結構體封裝

readonly 與 const 的初始化差異

  • const:編譯期常數,IL 內嵌數值,必須在宣告時初始化,不可為參考型別 (string 除外)。
  • readonly:執行期常數,可在宣告或建構子初始化,支援任意型別,版本控制友善 (參考組件更新無需重新編譯消費者)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved