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

问题描述 投票:-2回答:1

这个问题在这里已有答案:

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

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()
    {
    }
}

呼叫:

TranslationHelper instance = TranslationHelper.GetTranslationHelper();
TranslationHelper ins = TranslationHelper.translationHelpers;

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

c# .net design-patterns
1个回答
-1
投票

如果您使用的是.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()
    {
    }
}

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

  1. 它只能被自己调用,所以它不会提前实例化。
  2. 当与Lazy<T> lambda函数一起使用时,private static readonly关键字现在提供了一种从函数本身懒惰地创建类实例的视觉上清晰的方式。
  3. public Singleton Instance属性提供了一种从类外部访问该单例的方法。
© www.soinside.com 2019 - 2024. All rights reserved.