c# - 在c#中拥有Singleton类的正确方法是什么
问题描述
我正在学习 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;
我是初学者,所以我不确定这两种方法是否相同。请指导我。
解决方案
如果您使用的是 .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()
{
}
}
通过将此设计模式与私有构造函数一起使用,您可以确保该类及其仅在使用时创建。这是确保的,因为
- 它只能自己调用,因此不会提前实例化。
- 与 lambda 函数一起使用时的
Lazy<T>
关键字private static readonly
现在提供了一种视觉上清晰的方式,可以从函数本身中懒惰地创建类的实例。 - 该
public Singleton Instance
属性提供了一种从类外部访问该单例的方法。
推荐阅读
- javascript - 在浏览器中检测 Windows“增强指针精度”
- excel - 如何引用将被复制的表?
- c# - 调整浏览器窗口大小时如何停止页面刷新(跳转)?
- android - 如何在改造 2 中发送可选参数?
- azure - Azure 发布注释
- vba - Windows ftp 客户端中的“500 端口命令无效”错误
- c# - 实时服务器上的 Asp.net Core 应用程序向另一个项目中的目录抛出异常
- arrays - 如何使用 Python 2.7 在条件 IF 语句中检查和使用 numpy 数组的 dtype
- c# - C# 从包含 UTF-8 文本的 byte[] 数组中删除重音符号(变音符号)并进行比较
- axios - 如何使用 Nuxt.js 将 Vuex 变量传递给 axios?