当前位置:  开发笔记 > 编程语言 > 正文

为单例创建静态实例的这些方法有何不同?

如何解决《为单例创建静态实例的这些方法有何不同?》经验,为你挑选了1个好方法。

我最近遇到了一个错误,只有在将库构建为发布版本而不是调试版本时才会显示出来.该库是一个带有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似乎可以从另一个托管应用程序中完全使用.



1> Marc Gravell..:

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

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有