派生クラスの静的コンストラクタの呼び出しタイミング
ハマりかけたのでメモ。
Visual Studio 2019を使ってC#で確認しました。
問題になったコードを極限まで単純化したのが以下のコードです。
using System;
namespace StaticConstructorTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TestClass2.n);
}
}
public class TestClass1
{
public static int n = 1;
static TestClass1()
{
n = 2;
}
}
public class TestClass2 : TestClass1
{
static TestClass2()
{
n = 3;
}
}
}
直感的には出力は以下のようになると思っていました。
3
けれども実際の出力は以下でした。TestClass2の静的コンストラクタが呼ばれていません。
2
調べてみたところ、以下の記事を見つけました。
今回の問題は上記の「基底クラスではなく」の部分に引っかかっていたようです。コンソールにはTestClass2.nを出力していましたが、nはTestClass1のメンバーだったためTestClass2の静的コンストラクタが呼ばれていませんでした。知らんがな、こんな細かいルール。
そのため、以下のようにコードを修正すると
using System;
namespace StaticConstructorTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TestClass2.k); // 追加
Console.WriteLine(TestClass2.n);
}
}
public class TestClass1
{
public static int n = 1;
static TestClass1()
{
n = 2;
}
}
public class TestClass2 : TestClass1
{
public static int k = 5; // 追加
static TestClass2()
{
n = 3;
}
}
}
出力は以下のようになりました。
5
3
この記事が気に入ったらサポートをしてみませんか?