beforefieldinitフラグ

シングルトンクラスでバグが出た。リリース時のみ発生するバグだ。たかがシングルトンと思って油断していた。...というわけでstatic変数の初期化について考察。

class Test{
  static object o = new object();
}

この場合、beforefieldinitフラグがONになり、object o の初期化タイミングは決まらない。

class Test{
  static object o = new object();
  static Test{} // static コンストラクタ
}

この場合、beforefieldinitフラグがOFFになり、object o の初期化タイミングはTestクラスへの最初のアクセス時となる。

仕事では最初のタイプでシングルトンを実装していたわけだが、

  • VSから起動→最初のTestクラスへのアクセス時にobject o = new object() される
  • exeから起動→真っ先にobject o = new object() される

と動作が異なり苦戦することに...
しかしbeforefieldinitってなんやねん!

ここに詳しく書いてます→http://www.yoda.arachsys.com/csharp/beforefieldinit.html