在 C# 中使用 Singleton 类的正确方法是什么

Unb*_*ble -1 .net c# design-patterns

我正在学习 C# 中的单例设计模式,我用两种方式编写了下面的代码,我想知道哪一种是创建单例类的正确方法:

public sealed class TranslationHelper
{
    // first way
    private static readonly TranslationHelper translationHelper = new TranslationHelper();
    // second way
    public static readonly TranslationHelper translationHelpers = new TranslationHelper(); // Direct call

    public static TranslationHelper GetTranslationHelper()
    {
        return translationHelper;
    }

    private TranslationHelper()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

称呼:

TranslationHelper instance = TranslationHelper.GetTranslationHelper();
TranslationHelper ins = TranslationHelper.translationHelpers;
Run Code Online (Sandbox Code Playgroud)

我是初学者,所以我不确定这两种方法是否相同。请指导我。

Daf*_*ter 5

如果您使用 .Net 4 或更高版本,您可以使用Lazy<T>如下类型:

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将此设计模式与私有构造函数一起使用,您可以确保该类及其仅在使用时创建。这是可以保证的,因为

  1. 它只能由其自身调用,因此不会提前实例化。
  2. Lazy<T>与 lambda 函数一起使用时,关键字现在private static readonly提供了一种视觉上清晰的方法,可以从函数本身内部延迟创建类的实例。
  3. public Singleton Instance属性提供了一种从类外部访问该单例的方法。

  • 惰性为您提供延迟实例化,直到您实际引用实例属性,同时保持线程安全性,否则您需要自己管理。 (2认同)