LoginSignup
18
18

More than 5 years have passed since last update.

C# オブジェクト生成時の初期化順序(コンストラクタ、変数初期化子)

Posted at
  1. 子クラス: static変数初期化子
  2. 子クラス: staticコンストラクタ
  3. 子クラス: 変数初期化子
  4. 親クラス: static変数初期化子
  5. 親クラス: staticコンストラクタ
  6. 親クラス: 変数初期化子
  7. 親クラス: コンストラクタ(コンストラクタ初期化子)
  8. 親クラス: コンストラクタ
  9. 子クラス: コンストラクタ(コンストラクタ初期化子)
  10. 子クラス: コンストラクタ
確認用コード
// 変数初期化子テスト用のクラス
public class FieldClass
{
    public FieldClass(string str)
    {
        Console.WriteLine(str);
    }
}

// 親クラス
class BaseClass
{
    static FieldClass baseStaticField = new FieldClass("4. 親クラス: static変数初期化子");
    FieldClass baseField = new FieldClass("6. 親クラス: 変数初期化子");

    static BaseClass()
    {
        Console.WriteLine("5. 親クラス: staticコンストラクタ");
    }

    public BaseClass() : this("dummy")
    {
        Console.WriteLine("8. 親クラス: コンストラクタ");
    }

    public BaseClass(string dummy)
    {
        Console.WriteLine("7. 親クラス: コンストラクタ(コンストラクタ初期化子)");
    }
}

// 子クラス
class DerivedClass : BaseClass
{
    static FieldClass derivedStaticField = new FieldClass("1. 子クラス: static変数初期化子");
    FieldClass derivedField = new FieldClass("3. 子クラス: 変数初期化子");

    static DerivedClass()
    {
        Console.WriteLine("2. 子クラス: staticコンストラクタ");
    }

    public DerivedClass() : this("dummy")
    {
        Console.WriteLine("10. 子クラス: コンストラクタ");
    }

    public DerivedClass(string dummy)
    {
        Console.WriteLine("9. 子クラス: コンストラクタ(コンストラクタ初期化子)");
    }
}

public class ConstructorTest
{
    static void Main()
    {
        var obj = new DerivedClass(); // 子クラスをインスタンス化
    }
}
18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18