C# 在静态构造函数中初始化单例实例

C# 在静态构造函数中初始化单例实例,c#,singleton,lazy-evaluation,C#,Singleton,Lazy Evaluation,我想实现简单的单例,经过一些调查后,有以下工作良好。我使用一个简单的控制台应用程序来测试它,但是如果其他人可以对它发表评论,我会很有帮助。我之所以怀疑,是因为Singleton的新实例是在静态构造函数中创建的,不确定它是否有任何副作用 sealed class SingletonEx { public static readonly SingletonEx Instance; static SingletonEx() { if (null == Ins

我想实现简单的单例,经过一些调查后,有以下工作良好。我使用一个简单的控制台应用程序来测试它,但是如果其他人可以对它发表评论,我会很有帮助。我之所以怀疑,是因为Singleton的新实例是在静态构造函数中创建的,不确定它是否有任何副作用

 sealed class SingletonEx
{
    public static readonly SingletonEx Instance;

    static SingletonEx()
    {
        if (null == Instance)
        {
            Instance = new SingletonEx();

        }
    }
    private SingletonEx() { }


}

如果您感到好奇,我发现在这个主题上很有帮助。

这不是静态构造函数的典型用法,尽管可以这样做。副作用是,在代码中首次使用任何SingletonEx实例之前,构造函数都会运行。拥有一个静态构造函数不会对单例行为有太大的改变。但是,请注意,如果不是静态的,初始化将在另一个阶段发生

我会担心下面这句话: 公共静态只读单例实例; 以下是您的问题:
public-表示可以在类外更改。由于Singleton实例由私有静态成员变量引用,因此在调用instance属性首次引用该类之前,不会发生实例化。因此,该解决方案实现了惰性实例化属性的一种形式,如Singleton的设计模式形式。当实现设计模式时,尽可能多地遵循它的设计。
只读-也不应该在这里。它通常是可编辑的,除非您有充分的理由这样做

@PrestonGuillot可能重复,尽管您提供的链接有相关信息,但我不认为上面的代码模式作为对话的一部分进行了讨论。这里有关于静态构造函数的任何副作用的所有信息,关于使用静态构造函数实例化单例的讨论在注释中链接的一个问题中进行。您的代码只添加了一个不需要的空保护。重复的,除非您能更具体地说明副作用,否则表示如果它不是只读的,则可以在类之外更改,true。但它是只读的,以便始终具有完全相同的实例,这是singleton的全部目的。所以,是的,这里绝对需要只读。