C# singleton中的成员变量应该声明为静态的吗?

C# singleton中的成员变量应该声明为静态的吗?,c#,singleton,C#,Singleton,环顾web,我看到了这个实现(线程安全的)单例的简单模式(在C#中) 我理解,\u实例成员需要声明为静态,因为它是通过staticinstance()方法访问的 但其他成员是否应该声明为静态成员?根据定义,单例只存在一次,因此成员也只能存在一次(对于单个实例),就像静态变量只存在一次一样 我应该将\u数据声明为静态数据吗 功能上会有什么不同吗 性能有什么不同吗 有没有其他理由选择静态还是非静态 如果你有一个单实例,你就有一个类的实例。类成员不能是静态的(实例属性支持字段除外)。如果在单例中有多

环顾web,我看到了这个实现(线程安全的)单例的简单模式(在C#中)

我理解,
\u实例
成员需要声明为静态,因为它是通过static
instance()
方法访问的

但其他成员是否应该声明为静态成员?根据定义,单例只存在一次,因此成员也只能存在一次(对于单个实例),就像静态变量只存在一次一样

我应该将
\u数据
声明为静态数据吗

  • 功能上会有什么不同吗
  • 性能有什么不同吗
  • 有没有其他理由选择静态还是非静态

如果你有一个单实例,你就有一个类的实例。类成员不能是静态的(实例属性支持字段除外)。如果在单例中有多个static,那么实际上创建的不是一个单例而是多个单例。一般建议仅在绝对必要时使用static关键字


将singleton数据作为非静态类成员存储在singleton实例中更干净

如果您选择在静态类上使用单例(请参见和),那么我认为使用实例成员而不是静态成员更有意义

其他成员与在第三行上创建并命名为
\u instance
的对象相关。如果将
\u data
指定为静态-它将是类成员,而不是对象成员。因此,与语法或最佳实践无关,而是与您的意图和目标有关。@zerkms清楚地知道这一点,但由于它是一个单例,因此无论哪种方式,数据都只存在一次,不会有真正的区别。@njr您是否将单例作为一种变通方法,让静态类实现接口(然后我会尽可能保持一切静止,以符合最初的意图)“是的,还是出于其他原因?”哈罗德:的确,这是关于语义学的。但为了避免进一步混淆,我不会把单例作为特殊情况readers@harold:我使用单例是为了更灵活,因为我将来可能希望将对象作为参数传递。老实说,目前我可以使用静态类。我真的很好奇是否有“真实世界”单例的静态成员和非静态成员之间的区别。谢谢Alois。这是一个明确的答案。我明白你的意思,在非静态成员中存储实例数据更干净。我很好奇它是否会有任何其他副作用。性能不是一个真正的问题。没有明显的副作用,除非你真的没有很难显示它们。如果所有的Singleton成员都是非静态的,您将在第一次访问时初始化Singleton实例的所有字段。如果您确实在Singleton中隐藏了多个资源,那么最好将它们放入不同的Singleton中,或者稍后通过惰性成员在Singleton中初始化其余部分。感谢链接。dotnetperls实际上是我第一次发现这个模式的地方:)
public sealed class MySingleton
{
    private static readonly MySingleton _instance = new MySingleton();

    private string[] _data = new string[10];

    // Private constructor, so no outsiders have access.
    private MySingleton()
    {
        // Initialize _data member here
    }

    // Static method to provide access to instance
    public static MySingleton Instance
    {
      get { return _instance; }
    }

    public string GetStringCount
    {
        return _data.Length;
    }

}