【发布时间】:2020-03-04 19:27:09
【问题描述】:
更新:
我在这里读到了https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff650316(v=pandp.10)?redirectedfrom=MSDN 关于在 c# 中实现单例的 3 种不同方法。我对理解这一行特别感兴趣:
因为实例是在 Instance 属性方法中创建的, 该类可以执行其他功能(例如, 实例化一个子类),即使它可能会引入不受欢迎的 依赖关系。
我知道虽然惰性实例化不是线程安全的,但仍然因为它只按需实例化它,因此每次加载类时都避免实例化。我还注意到,在延迟实例化中,我可以使用非默认构造函数并传递参数,而在静态中。但是说我不介意每次加载时都会实例化它,并且我对默认构造函数很满意,我为什么要选择 Lazy 而不是 static 甚至是多线程方法?有什么 Lazy 可以让我得到静态和多线程无法做到的吗?一个可以被子分类而另一个不能吗?
另外,该页面似乎在说静态初始化也是线程安全的?这是为什么?如果后者也很好,他们为什么要继续使用第三种多线程方法?
因为 Singleton 实例被私有静态引用 成员变量,实例化不会发生,直到类 首先由对 Instance 属性的调用引用。这个解决方案 因此实现了惰性实例化属性的一种形式,如 单例的设计模式形式。
(尽管如此,我不明白这一段的第一部分:如果这里的实例化也只发生一次,就像他们在之前的几段中所说的那样:
“在此策略中,实例是在第一次任何成员时创建的 类的引用。”
它与惰性方法有什么不同?)
总而言之,我的问题是,相比第一种惰性方法,静态方法能解决什么问题?除了它允许我使用非默认构造函数之外,我为什么还要选择 Lazy?
虽然我在做:
考虑以下两对 Lazy 与 Static 的示例,我的问题是,在每一对中,它们之间有何不同?我可以看到,'get' 嵌套在 GetInstance/Instance 方法中,但它有什么不同吗?
public class LazySingleton
{
private static LazySingleton _LSInstance;
private LazySingleton() { }
public static LazySingleton GetInstnace
{
get{
if (_LSInstance == null)
{
_LSInstance = new LazySingleton();
}
return _LSInstance;
}
}
}
public class LazySingleton
{
private static LazySingleton _LSInstance { get; set; }
private LazySingleton() { }
public static LazySingleton GetInstnace() {
if (_LSInstance == null)
_LSInstance = new LazySingleton();
return _LSInstance;
}
}
================================================ ========
public class Singleton
{
private Singleton()
{
}
private static Singleton _LSInstance = new Singleton();
public static Singleton GetInstnace
{
get{
return _LSInstance;
}
}
}
public class Singleton
{
private Singleton() { }
private static Singleton _LSInstance = new Singleton();
public static Singleton GetInstnace()
{
return _LSInstance;
}
}
非常感谢您的回复,可以为我澄清这一点,谢谢!
【问题讨论】:
标签: c# design-patterns singleton getter-setter