因此,使用全新的C# 6,我们得到了那些整洁的自动属性初始化器。我想我还是利用这些来做比以往更简洁的单身汉吧。显然,其他人也有这个想法。
public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}我的问题是:
(它看起来可能类似于这个问题,但它不是)
发布于 2015-09-23 22:10:27
您的代码将扩展到以下内容:
public sealed class Singleton
{
private static readonly Singleton <Instance>k__BackingField = new Singleton();
public static Singleton Instance { get { return <Instance>k__BackingField; } }
private Singleton() { /* some initialization code */ }
}(<Instance>k__BackingField是编译器生成字段的说不出的名字。)
因此,代码的属性将与上面的代码完全相同。也就是说,这个模式是线程安全的,它可能是一个好主意,视情况而定。
假设在访问Instance之前没有访问此类型的任何其他静态成员,那么懒惰的确切程度取决于运行时。通常情况下,它将类似于“第一次创建一个可以访问Instance的方法是JIT编译的方法”,但是您没有任何保证。
如果希望确保在首次访问Instance之前创建实例,请向类中添加一个空的静态构造函数。(这可能对性能有很小的负面影响,但这对你来说可能无关紧要。)
由于这其中的大部分并不是C# 6所特有的,更好的信息来源将是Jon关于单身汉和静态构造函数/类型初始化器的文章。
https://stackoverflow.com/questions/32738283
复制相似问题