C# 单例实例永远不会为空
C# singleton instance is never null
我正在尝试在 Azure web 作业中实现单例模式。在本地调试实例永远不会为空。它总是设置为单例对象本身。我觉得我在这里遗漏了一些非常明显的东西。
public sealed class HubErrorList
{
private static volatile HubErrorList instance;
private static object syncRoot = new Object();
private HubErrorList() {}
public static HubErrorList Instance
{
get {
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new HubErrorList();
}
}
}
return instance;
}
}
}
在访问 属性 之前,该实例将保持为空。根据您对此的检查方式,您的工具可能会导致这种差异。
也就是说,更简单更好的 "lazy initialized" 单例模式是使用 Lazy<T>
代替:
public sealed class HubErrorList
{
private static Lazy<HubErrorList> instance = new Lazy<HubErrorList>(() => new HubErrorList());
private HubErrorList() {}
public static HubErrorList Instance { get { return instance.Value; } }
}
我正在尝试在 Azure web 作业中实现单例模式。在本地调试实例永远不会为空。它总是设置为单例对象本身。我觉得我在这里遗漏了一些非常明显的东西。
public sealed class HubErrorList
{
private static volatile HubErrorList instance;
private static object syncRoot = new Object();
private HubErrorList() {}
public static HubErrorList Instance
{
get {
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new HubErrorList();
}
}
}
return instance;
}
}
}
在访问 属性 之前,该实例将保持为空。根据您对此的检查方式,您的工具可能会导致这种差异。
也就是说,更简单更好的 "lazy initialized" 单例模式是使用 Lazy<T>
代替:
public sealed class HubErrorList
{
private static Lazy<HubErrorList> instance = new Lazy<HubErrorList>(() => new HubErrorList());
private HubErrorList() {}
public static HubErrorList Instance { get { return instance.Value; } }
}