確保某個類只有一個實例git
public sealed class Singleton { private static Singleton _instance = new Singleton(); //將構造函數設置私有,外部不能new private Singleton() { } public static Singleton Instance => _instance; }
等價於github
public sealed class Singleton { private static Singleton _instance; static Singleton() { _instance = new Singleton(); } //將構造函數設置私有,外部不能new private Singleton() { } public static Singleton Instance => _instance; }
public sealed class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton Instance => _instance = _instance ?? new Singleton(); }
public sealed class Singleton { private static readonly object _lock = new object(); private static Singleton _instance; private Singleton() { Console.WriteLine("Singleton Constructor"); } public static Singleton Instance { get { /// 避免走內核代碼 if (_instance != null) return _instance; lock (_lock) { if (_instance == null) { var temp = new Singleton(); //確保_instance寫入以前,Singleton已經初始化完成 System.Threading.Volatile.Write<Singleton>(ref _instance, temp); } } return _instance; } } }
public sealed class Singleton { private static Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton(), true); private Singleton() { Console.WriteLine("Singleton Constructor"); } public static Singleton Instance => _instance.Value; }