gpt4 book ai didi

c# - 自动属性初始化器单例实现

转载 作者:太空狗 更新时间:2023-10-29 18:35:09 24 4
gpt4 key购买 nike

因此,借助全新的 C# 6,我们获得了那些精巧的自动属性初始化器。我想我不妨利用这些来制作比以往更简洁的单例。显然 someone else我也有这个想法。

public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}

我的问题是:

  1. 它的线程安全性如何?
  2. 它有多懒惰,或者实际创建实例的时间? (不是优先级,但可以作为以后的引用)
  3. 总体来说这是个好主意吗?

(它可能看起来类似于 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 之前没有访问此类型的任何其他静态成员,那么懒惰的确切程度取决于运行时。通常,它类似于“第一次创建实例时,可以访问 Instance 的方法是 JIT 编译的”,但您对此没有任何保证。

如果你想确保实例是在Instance之前创建的第一次访问时,向您的类添加一个空的静态构造函数。 (这可能会对性能产生轻微的负面影响,但这对您来说可能无关紧要。)

由于其中大部分内容并非真正特定于 C# 6,因此 Jon Skeet 关于 singletons 的文章是进一步信息的良好来源。和 static constructors/type initializers .

关于c# - 自动属性初始化器单例实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com