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

C# 靜態建構函式與基底建構函式自動呼叫機制

     編輯:關於C語言

靜態建構函式

  • 無存取修飾詞、無參數
  • 在**首次**建立實例或存取靜態成員前**自動執行一次**
  • 用於初始化靜態欄位、執行一次性設定
  • 不可直接呼叫,時機由 CLR 控制

class MyClass
{
    public static int Num;
    public static void ShowNum() => Console.WriteLine(Num);
    public void Msg() => Console.WriteLine("Msg");

    static MyClass() { Num = 123; Console.WriteLine("Static ctor"); }
}

MyClass.ShowNum(); // 先觸發靜態建構函數 -> 123
MyClass.Num = 2009;
MyClass.ShowNum(); // 2009
new MyClass().Msg(); // Msg (靜態建構函式不再執行)

基底建構函式自動呼叫

衍生類別建構函式**隱含**呼叫基底無參建構函式 (若基底有參數建構函式則**必須**顯式 `base(...)`):


class Parent { public Parent() => Console.WriteLine("Parent"); }
class Child1 : Parent { public Child1() => Console.WriteLine("Child1"); }
class Child2 : Child1 { public Child2() => Console.WriteLine("Child2"); }

new Parent();    // Parent
new Child1();    // Parent / Child1
new Child2();    // Parent / Child1 / Child2

// 帶參數版本
class Child1 : Parent
{
    public Child1(int x) => Console.WriteLine(x);
}
class Child2 : Child1
{
    public Child2(int x, int y) => Console.WriteLine(x + y);
}
new Child1(999);       // Parent / 999
new Child2(111, 222);  // Parent / Child1 / 333

注意事項

  • 靜態建構函式拋出例外 → 型別標記為不可用,後續存取拋 `TypeInitializationException`
  • 避免在靜態建構函式中執行耗時/可能失敗操作
  • 基底建構函式拋出例外 → 衍生實例建立失敗,記憶體不會洩漏 (CLR 保證)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved