開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. 【C#】staticフィールドは記述順によって値が変わることがある
no-image

【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のドキュメントには以下のように記載されています。

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

> 静的フィールド変数初期化子が静的コンストラクターのクラスに存在する場合、それらは、クラス宣言に出現するテキストの順序で実行されます。
> 静的フィールドを初期化するための静的コンストラクターを指定しないと、すべての静的フィールドは、「C# 型の既定値」で示されている既定値に初期化されます。

今回の場合、Aの初期化時にBが初期化されておらず、intの規定値である0で初期化されていたため出力結果も0になったということでした。

まとめ

まさか記述順で値が変わるとは思わなかったので結構ハマりました。

実際にハマってる時にはこういう情報に辿り着くのも難しそうですが、参考になれば幸いです。

  • posted by かみちゃん
  • C#
TOPに戻る