C# Singleton 应该包含静态方法吗?
C# should Singleton contain static methods?
我在为包含状态变量的 class 使用 Singleton
或 Static
之间做出选择时遇到了很多麻烦。我希望 class 对象实例化并仅作为一个对象存在。
我知道这两种方式都可以存储状态变量。 Static
Class 似乎很容易处理变量,因为所有方法都将变为 static
,它们可以访问 static
变量而无需任何进一步的工作。
但是,Singleton
的情况有所不同。我有两种方法;一种需要访问 Singleton
的 Instance
变量,另一种不需要访问 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;
}
}
从上面给出的例子来看,一共有三种方法; TestA
、TestB
和 TestC
。
TestA
是一个 non-static
实例方法,可以访问其 属性.
TestB
是一个 static
方法,但访问 Instance
以获取其属性。
TestC
是实例没有用的static
方法
这引出了一个问题:
- 如果
Singleton
仅包含 static
方法,并通过 static
Instance
[=87] 访问其 Instance
属性和方法=]?换句话说,所有方法都类似于 TestB
或 TestC
.
Singleton
是否应该仅包含 non-static
方法,无论是否需要 Instance
?所有类似于 TestA
. 的方法
Singleton
是否应该包含混合的 static
和 non-static
(在本例中为 TestA
和 TestB
类)方法?我相信它会变得相当混乱。
- 如果没有,我该怎么办?我是否应该放弃
Singleton
的想法,并为每个只实例化一次的 classes 使用所有 static
?
编辑:对于类似的问题,Singleton
是否应该在 Instance
旁边包含任何 Static
variables/field/properties?
你不应该混淆这两种模式。
如果你有单例模式,唯一的静态字段应该是实例(+ getter)。您的所有方法和字段都应该可以通过实例访问。混为一谈只会造成混乱。
如果您选择静态 class 模式,请不要在内部使用秘密实例,这就是 .NET 的工作。
如果您不确定哪种模式最适合您,请查看这篇 Singleton-vs-Static 文章。它解释了它们两者的优缺点:https://www.dotnetperls.com/singleton-static
我在为包含状态变量的 class 使用 Singleton
或 Static
之间做出选择时遇到了很多麻烦。我希望 class 对象实例化并仅作为一个对象存在。
我知道这两种方式都可以存储状态变量。 Static
Class 似乎很容易处理变量,因为所有方法都将变为 static
,它们可以访问 static
变量而无需任何进一步的工作。
但是,Singleton
的情况有所不同。我有两种方法;一种需要访问 Singleton
的 Instance
变量,另一种不需要访问 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;
}
}
从上面给出的例子来看,一共有三种方法; TestA
、TestB
和 TestC
。
TestA
是一个non-static
实例方法,可以访问其 属性.TestB
是一个static
方法,但访问Instance
以获取其属性。TestC
是实例没有用的static
方法
这引出了一个问题:
- 如果
Singleton
仅包含static
方法,并通过static
Instance
[=87] 访问其Instance
属性和方法=]?换句话说,所有方法都类似于TestB
或TestC
. Singleton
是否应该仅包含non-static
方法,无论是否需要Instance
?所有类似于TestA
. 的方法
Singleton
是否应该包含混合的static
和non-static
(在本例中为TestA
和TestB
类)方法?我相信它会变得相当混乱。- 如果没有,我该怎么办?我是否应该放弃
Singleton
的想法,并为每个只实例化一次的 classes 使用所有static
?
编辑:对于类似的问题,Singleton
是否应该在 Instance
旁边包含任何 Static
variables/field/properties?
你不应该混淆这两种模式。
如果你有单例模式,唯一的静态字段应该是实例(+ getter)。您的所有方法和字段都应该可以通过实例访问。混为一谈只会造成混乱。
如果您选择静态 class 模式,请不要在内部使用秘密实例,这就是 .NET 的工作。
如果您不确定哪种模式最适合您,请查看这篇 Singleton-vs-Static 文章。它解释了它们两者的优缺点:https://www.dotnetperls.com/singleton-static