Singletonパターン
定石としては、
using System; public sealed class Singleton { static readonly Singleton instance = new Singleton (); Singleton () { Console.WriteLine ("Constructor."); } public static Singleton Instance { get { return instance; } } } class Program { static void Main () { Console.WriteLine ("Main."); object o = Singleton.Instance; } } /* Constructor. Main. */
であり、スレッドセーフ&インスタンス化の遅延・・・のはずですが、Singleton.Instanceへのアクセス前にコンストラクタが呼ばれてしまいます。ildasmでアセンブリを覗いてみると、beforefieldinitがマークされており、これが原因っぽいです。んではと、
using System; public sealed class Singleton { static readonly Singleton instance = new Singleton (); // beforefieldinitを付けさせない static Singleton () {} Singleton () { Console.WriteLine ("Constructor."); } public static Singleton Instance { get { return instance; } } } class Program { static void Main () { Console.WriteLine ("Main."); object o = Singleton.Instance; } } /* Main. Constructor. */
静的コンストラクタを書くとbeforefieldinitが付かないので望み通りの動作になります。