Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态构造函数&;独生子女班_C#_Multithreading_Static_Singleton - Fatal编程技术网

C# 静态构造函数&;独生子女班

C# 静态构造函数&;独生子女班,c#,multithreading,static,singleton,C#,Multithreading,Static,Singleton,我有一个实现Singleton设计模式的对象缓存。我处理singleton的方法总是在第一次访问属性时延迟加载静态实例 public static Widget { get { if(instance==null) instance = new Widget(); return instance; } } 但是,我知道这种方法不是线程安全的,例如检查null会带来一点低效率。在实例化静态实例的类上实现静态构造函数是否明智 据我所知,只要第

我有一个实现Singleton设计模式的对象缓存。我处理singleton的方法总是在第一次访问属性时延迟加载静态实例

public static Widget
{
    get
    {
        if(instance==null) instance = new Widget();
        return instance;
    }
}
但是,我知道这种方法不是线程安全的,例如检查null会带来一点低效率。在实例化静态实例的类上实现静态构造函数是否明智

据我所知,只要第一次静态属性访问发生,就会调用静态构造函数。这是有效的吗?与当前的延迟加载方法相比,它会提供任何好处吗?还是更好地探索代理实现,或者使用锁强制它是线程安全的

public static Widget
    {
        get
        {
            if(instance==null)
            {
                lock(padlock)
                {
                    if(instance==null) instance = new Widget();
                }
            }
            return instance;
        }
    }
我对静态构造函数没有太多的经验,所以如果它是延迟加载属性的一个同等或更差的实现,我不想插手这个想法

干杯,
Gary

Jon Skeet对讨论这个问题的Singleton有很好的理解。

与其使用自己的线程安全惰性初始值设定项并可能弄错它,我建议您阅读
lazy
上的msdn


我相信这个问答线程会给你想要的东西:这也适用于IOC容器:链接应该更新到