C# 在C中这样定义单例是正确的吗?

C# 在C中这样定义单例是正确的吗?,c#,C#,我个人认为 也就是说: 你的代码不安全,因为 class MyClass { private MyClass(){} private static MyClass instance; public static MyClass Instance { get { return instance=instance??new MyClass(); } } } 它不是原子的 处理许多与创建单例类有

我个人认为

也就是说:

你的代码不安全,因为

class MyClass
{
    private MyClass(){}

    private static MyClass instance;

    public static MyClass Instance
    {
       get
       {
          return instance=instance??new MyClass();
       }
    }
}
它不是原子的

处理许多与创建单例类有关的问题

因此:

公共类MyClass
{
公共静态MyClass实例
{
得到
{
返回instanceLazy.Value;
}
}
私有静态惰性instanceLazy=
new Lazy(()=>new MyClass());
私有MyClass()
{
}
}

在多线程方面绝对没有。如果只有一个线程,为什么需要单线程?您应该在代码中添加锁。关于
它会起作用,但我更愿意用更普通的方式来写,如果
,请阅读。您的代码在“第一个版本-非线程安全”中显示为错误示例。正确的方法是不定义单例。这是愚蠢设计的首字母缩略词的一部分,这是有原因的。相反,请考虑SOLID design。非常感谢您关注我的多线程安全性,我甚至不知道这一点。当有人提到单线程时,我总是想知道它的范围是什么?每个线程、每个(虚拟)计算机、计算机集群、数据中心只有一个实例,或者实际上世界上只有一个实例?请注意,Lazy在.NET 4及更高版本中可用。(如果您想在早期版本中实现类似的功能,请参考源代码。)感谢您的回复。上面提到的线程安全问题呢?这满足多线程安全标准?是的。在默认模式下,
Lazy
是线程安全的。
return instance = instance ?? new MyClass();
public class MyClass
{
    public static MyClass Instance
    {
        get
        {
            return instanceLazy.Value;
        }
    }

    private static Lazy<MyClass> instanceLazy = 
        new Lazy<MyClass>(() => new MyClass());

    private MyClass()
    {
    }
}