单例模式
经典
public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Locking if (null == _instance) { lock (SynObject) { if (null == _instance) { _instance = new Singleton(); } } } return _instance; } } }
延迟初始化
/// <summary> /// Delaies initialization. /// </summary> public sealed class Singleton { private Singleton() { } /// <summary> /// Gets the instance. /// </summary> public static Singleton Instance { get { return Nested._instance; } } private class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly Singleton _instance = new Singleton(); } }
这里我们把初始化工作放到Nested类中的一个静态成员来完成,这样就实现了延迟初始化。
Lazy<T> type
/// <summary> /// .NET 4's Lazy<T> type /// </summary> public sealed class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance { get { return lazy.Value; } } private Singleton() { } }