【问题标题】:C# should Singleton contain static methods?C# Singleton 应该包含静态方法吗?
【发布时间】:2017-02-10 12:46:52
【问题描述】:

对于包含状态变量的类,我在选择使用SingletonStatic 时遇到了很多麻烦。我希望类对象实例化并仅作为一个对象存在。

我知道两种方式都可以存储状态变量。 Static 类似乎很容易处理变量,因为所有方法都将变为 static,它们可以访问 static 变量而无需任何进一步的工作。

但是,Singleton 的情况有所不同。我有两种方法;一种需要访问SingletonInstance 变量,另一种不需要访问Instance 变量,我可以将其标记为静态。

一个例子:

/// <summary>Singleton.</summary>
    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton(); /// <summary>Instance.</summary>
        public static Singleton Instance { get { return instance; } }

        private int integer; /// <summary>Integer.</summary>
        public int Integer { set { integer = value; } get { return integer; } }

        /// <summary>Constructor.</summary>
        private Singleton() { }

        /// <summary>TestA</summary>
        public void TestA(int val)
        {
            Integer = val;
        }

        /// <summary>TestB</summary>
        public static int TestB(int val)
        {
            return Instance.Integer * val;
        }

        /// <summary>TestC</summary>
        public static int TestC(int val)
        {
            return val * val;
        }
    }

从上面给出的例子来看,有三种方法; TestATestBTestC

  1. TestA 是一个 non-static 实例方法,可以访问其属性。
  2. TestB 是一个 static 方法,但访问 Instance 以获取其属性。
  3. TestC 是实例没有用的static 方法。

这引出了一个问题:

  1. 是否应该Singleton 只包含static 方法,并通过static Instance 属性访问其Instance 属性和方法?换句话说,所有方法都类似于TestBTestC
  2. 无论是否需要InstanceSingleton 是否应该只包含non-static 方法?所有方法类似于TestA
  3. Singleton 是否应该同时包含 staticnon-static(在本例中为 TestATestB 种类)方法?我相信它会变得相当混乱。
  4. 如果没有,我该怎么办?我是否应该放弃Singleton 的想法,并为每个只实例化一次的类使用所有static

编辑:有类似的问题,Singleton 是否应该在Instance 旁边包含任何Static 变量/字段/属性?

【问题讨论】:

    标签: c# methods static singleton non-static


    【解决方案1】:

    你不应该混淆这两种模式。

    如果你有一个单例模式,唯一的静态字段应该是实例(+ getter)。您的所有方法和字段都应该可以通过实例访问。如果你把它混在一起只会造成混乱。

    如果您选择静态类模式,请不要在内部使用秘密实例,这就是 .NET 的工作。

    如果您不确定哪种模式最适合您,请查看这篇 Singleton-vs-Static 文章。它解释了两者的优缺点:https://www.dotnetperls.com/singleton-static

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多