Auto-属性 initializer 单例实现
Auto-property initializer Singleton implementation
因此,借助全新的 C# 6,我们获得了那些简洁的自动 属性 初始化程序。我想我不妨利用这些来制作比以往更简洁的单身人士。显然 someone else 也有这个想法。
public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}
我的问题是:
- 它的线程安全性如何?
- 它是多么懒惰,或者什么时候真正创建了实例? (不是优先级,但可以作为以后的参考)
- 总体来说这是个好主意吗?
(它可能看起来类似于 this question,但它不是)
您的代码将扩展为以下内容:
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
是编译器生成字段的 unspeakable name。)
因此,您的代码的属性将与上面的代码完全相同。也就是说,这种模式是线程安全的,根据情况它可能是个好主意。
假设您在访问 Instance
之前没有访问此类型的任何其他静态成员,那么惰性的确切程度取决于运行时。通常,它会类似于 "the instance is created the first time a method that could access Instance
is JIT-compiled",但您对此没有任何保证。
如果您想确保实例是在 Instance
首次访问之前创建的,请向您的 class 添加一个空的静态构造函数。 (这可能会对性能产生轻微的负面影响,但这对您来说可能无关紧要。)
由于其中大部分并不是真正特定于 C# 6,因此 Jon Skeet 关于 singletons and static constructors/type initializers.
的文章是进一步信息的一个很好的来源
因此,借助全新的 C# 6,我们获得了那些简洁的自动 属性 初始化程序。我想我不妨利用这些来制作比以往更简洁的单身人士。显然 someone else 也有这个想法。
public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}
我的问题是:
- 它的线程安全性如何?
- 它是多么懒惰,或者什么时候真正创建了实例? (不是优先级,但可以作为以后的参考)
- 总体来说这是个好主意吗?
(它可能看起来类似于 this question,但它不是)
您的代码将扩展为以下内容:
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
是编译器生成字段的 unspeakable name。)
因此,您的代码的属性将与上面的代码完全相同。也就是说,这种模式是线程安全的,根据情况它可能是个好主意。
假设您在访问 Instance
之前没有访问此类型的任何其他静态成员,那么惰性的确切程度取决于运行时。通常,它会类似于 "the instance is created the first time a method that could access Instance
is JIT-compiled",但您对此没有任何保证。
如果您想确保实例是在 Instance
首次访问之前创建的,请向您的 class 添加一个空的静态构造函数。 (这可能会对性能产生轻微的负面影响,但这对您来说可能无关紧要。)
由于其中大部分并不是真正特定于 C# 6,因此 Jon Skeet 关于 singletons and static constructors/type initializers.
的文章是进一步信息的一个很好的来源