在 CSDN 看到的這個範例有兩個問題:

  • 不是 thread-safe
  • 假如 T 沒有公開無參數的建構函數,會在 runtime 時拋出異常。事實上,這個問題可以使用 generic constraint 在 compiler time 時避免。

所以下面是改良過的版本:

public class Singleton where T : new()
{
  private static T _instance = new T();

  // to disable beforefieldinit flag
  static Singleton()
  {}

  public static T Instance
  {
    get
    {
      return _instance;
    }
  }
}