【C#】staticフィールドは記述順によって値が変わることがある
こんにちは、カミオです。
今回はconstのバージョニング問題対策でconstをstatic readonlyに置き換えた際に遭遇した問題について紹介したいと思います。
constのバージョニング問題については以下の記事にわかりやすくまとめられています。
https://ufcpp.net/study/csharp/sp_const.html#versioning
環境
- Windows 11 Home
- .NET 7.0
実験
staticフィールドが別のstaticフィールドを参照するようなコードを用意します。
class Program
{
static int A = B;
static int B = 1;
static void Main(string[] args)
{
Console.WriteLine(A);
}
}
Aの期待値は1ですが、実行するとどうなるでしょうか?
実行結果は以下になります。
0
1ではなく0が出力されました。
ちなみにstaticをconstにした場合や、AとBの記述順を逆にすると1が出力されます。
これはどういうことでしょうか。
staticフィールド初期化の仕様
Microsoftのドキュメントには以下のように記載されています。
> 静的フィールド変数初期化子が静的コンストラクターのクラスに存在する場合、それらは、クラス宣言に出現するテキストの順序で実行されます。
> 静的フィールドを初期化するための静的コンストラクターを指定しないと、すべての静的フィールドは、「C# 型の既定値」で示されている既定値に初期化されます。
今回の場合、Aの初期化時にBが初期化されておらず、intの規定値である0で初期化されていたため出力結果も0になったということでした。
まとめ
まさか記述順で値が変わるとは思わなかったので結構ハマりました。
実際にハマってる時にはこういう情報に辿り着くのも難しそうですが、参考になれば幸いです。