public class Manager {
private static Manager _instance;
public static Manager Instance {
get { return Manager._instance; } // 未初始化,永遠返回 null
}
public bool Active { get; set; }
public bool A() { return true; }
}
直接訪問 Manager.Instance.Active 會拋 NullReferenceException。
public sealed class Manager {
private static volatile Manager _instance;
private static readonly object _lock = new object();
private Manager() {} // 私有構造函數
public static Manager Instance {
get {
if (_instance == null) {
lock (_lock) {
if (_instance == null) _instance = new Manager();
}
}
return _instance;
}
}
public bool Active { get; set; }
public bool A() => true;
}
public sealed class Manager {
private static readonly Manager _instance;
static Manager() { _instance = new Manager(); } // 靜態構造函數
private Manager() {}
public static Manager Instance => _instance;
public bool Active { get; set; }
public bool A() => true;
}
public sealed class Manager {
private Manager() {}
public static Manager Instance => Nested.Instance;
private class Nested {
static Nested() {}
internal static readonly Manager Instance = new Manager();
}
public bool Active { get; set; }
public bool A() => true;
}
Manager.Instance 返回的是 同一個對象引用。
Manager.Instance.Active 訪問該對象的屬性。
Manager.Instance.A() 調用該對象的實例方法。
本質都是對同一實例的成員訪問,無任何魔法。
Manager.Instance.Active = true;
bool ok = Manager.Instance.A();
Console.WriteLine(Manager.Instance.Active); // True
private 防止外部 new。sealed 防止繼承破壞單例。Lazy<T> 或靜態構造函數一次性完成。