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