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

C# 類成員初始化與構造函數執行順序測試(上)

     編輯:關於C語言

經典面試題:給定基類與派生類均含 readonly 字段初始化器與構造函數,實例化派生類時輸出順序為何?

測試代碼

class Foo
{
    public Foo(string s) { Console.WriteLine("Foo constructor: {0}", s); }
    public void Bar() { }
}

class Base
{
    readonly Foo baseFoo = new Foo("Base initializer");
    public Base() { Console.WriteLine("Base constructor"); }
}

class Derived : Base
{
    readonly Foo derivedFoo = new Foo("Derived initializer.");
    public Derived() { Console.WriteLine("Derived constructor"); }
}

class Program
{
    static void Main() { new Derived(); }
}

直覺 vs 現實

直覺以為:Base initializer → Base constructor → Derived initializer → Derived constructor。
實際輸出:

Foo constructor: Derived initializer.
Foo constructor: Base initializer
Base constructor
Derived constructor

規律總結

  1. 實例字段初始化器按 從最派生類到基類 順序執行。
  2. 構造函數體按 從基類到最派生類 順序執行。
  3. 這符合「深層類依賴淺層類」的依賴方向,確保基類構造時派生類字段已就緒。

下篇將通過反例深入剖析設計動機。

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