1. 程式人生 > 其它 >[C#程式設計指南] 靜態建構函式 : 執行順序

[C#程式設計指南] 靜態建構函式 : 執行順序

建構函式分類回顧

  根據前面對建構函式基本概念的介紹,建構函式可以相應的分為:①例項級別的建構函式 ②類級別的建構函式例項級別的建構函式會在每次建立物件例項的時候都會被呼叫到,類級別的建構函式僅僅會在首次建立該類的例項或者引用該類的靜態成員時被呼叫到根據建構函式(例項級別的建構函式)和靜態建構函式(類級別的建構函式)的相關概念,當一個類同時包含有建構函式和靜態建構函式時,可以推測在建立該類的物件例項的時候,其靜態建構函式先於其建構函式執行,當一個父類和其子類同時包含有它們各自的建構函式和靜態建構函式時,情況就比較複雜,沒法直接從相關概念中推測父類和其子類建構函式和靜態建構函式的執行順序,這裡通過簡單的程式碼簡單分析這種情況下,父類和其子類建構函式和靜態建構函式的執行順序。

建構函式執行順序

⭐ 首先,宣告父類Father和其子類Son,它們都同時包含有它們各自的建構函式和靜態建構函式:

public class Father
{
    static Father()
    {
        Console.WriteLine("父類靜態建構函式被呼叫!");
    }

    public Father()
    {
        Console.WriteLine("父類建構函式被呼叫!");
    }
}

public class Son : Father
{
    static Son()
    {
        Console.WriteLine(
"子類靜態建構函式被呼叫!"); } public Son() { Console.WriteLine("子類建構函式被呼叫!"); } }

⭐ 其次,建立2個Son的物件例項:

class Program
{
    static void Main(string[] args)
    {
        Son son1 = new Son();
        Son son2 = new Son();
        Console.ReadKey();
    }
}

⭐ 最後,編譯執行看控制檯輸出結果:

  根據控制檯的輸出結果,可以得出結論:當一個父類和其子類同時包含有它們各自的建構函式和靜態建構函式,子類建立例項時,如果這是首次建立該類的例項,則子類和父類的靜態建構函式先被呼叫:首先子類的靜態建構函式被呼叫,接著父類的靜態建構函式被呼叫(如果不是首次建立該類的例項,則子類和父類的靜態建構函式都不會被呼叫),而後子類和父類的建構函式後被呼叫:首先父類的建構函式被呼叫,接著子類的建構函式被呼叫。

  總結:⭐ 靜態建構函式先於建構函式執行

     ⭐ 靜態建構函式執行順序:子類靜態建構函式被呼叫 -> 父類靜態建構函式被呼叫

     ⭐ 建構函式執行順序:父類建構函式被呼叫 -> 子類建構函式被呼叫