gpt4 book ai didi

.net - 这些为单例创建静态实例的方法有什么区别?

转载 作者:行者123 更新时间:2023-12-04 14:37:34 25 4
gpt4 key购买 nike

我最近遇到了一个错误,只有在将库构建为发布版本而不是调试版本时才会表现出来。该库是一个带有 COM 包装器的 .NET dll,我正在使用 CoCreateInstance 从非托管 C++ 应用程序中的 dll 创建一个类。当我最终追踪到错误时,它是由访问单例对象引起的。我有这样声明的单例实例:

private static readonly MyObjectType s_instance = new MyObjectType;

然后使用以下命令访问它:
public static MyObjectType Instance 
{
get
{
return s_instance;
}
}

这是失败的。将其更改为:
private static MyObjectType s_instance;

public static MyObjectType Instance
{
get
{
if (s_instance==null)
{
s_instance = new MyObjectType();
}
return s_instance;
}
}

解决了这个问题。任何想法为什么最初的使用不起作用以及这样做是否有任何缺点?

发布 dll 似乎完全可以从另一个托管应用程序中使用。

最佳答案

尝试添加(空)静态构造函数,或在静态构造函数中初始化单例。

Jon Skeet 对单例模式进行了全面的讨论 here .我不确定它为什么失败,但我猜测它可能与“beforefieldinit”标志有关。参见他的第四个例子,他添加了一个静态构造函数来调整这个标志。我并不声称自己是 beforefieldinit 方面的专家,但这种症状似乎符合所讨论的一些症状 here .

关于.net - 这些为单例创建静态实例的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217932/

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