为什么选择静态类而不是单例实现?

Ela*_*lad 30 .net c# singleton static

静态对比 在SO中已经多次讨论过单身人士问题.
然而,所有的答案都指出了单身人士的许多优点.
我的问题是 - 静态类优于单例的优点是什么?为什么不每次只选择单身?

小智 40

静态类是您框中的技术工具 - 基本上是一种语言功能.

Singleton是一个建筑概念.

您可以使用静态类作为实现单例概念的方法.或者您可以使用其他方法.

对于C#中的静态类,如果你不小心,有两个潜在的危险.

  • 在应用程序生命周期结束之前,不会释放所请求的资源
  • 静态变量的值在应用程序中共享.对ASP.NET应用程序尤其不利,因为这些值将在驻留在特定应用程序域中的站点的所有用户之间共享.


ris*_*ism 23

来自MSDN

静态类和类成员用于创建可在不创建类实例的情况下访问的数据和函数.静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么,数据和函数都不会更改.当类中没有依赖于对象标识的数据或行为时,可以使用静态类.

关键是静态类do not require an instance reference.另请注意,静态类是由语言和编译器专门启用的.

Singleton类只是实现Singleton设计模式的用户编码类.单身人士的目的是restrict instantiation of an class to a single instance.

如果您将每个静态类编码为单例,则每次使用它时都必须实例化该类.

Console.WriteLine('Hello World');
Run Code Online (Sandbox Code Playgroud)

会成为

Console c = Console.getInstance();
c.WriteLine('Hello World');
Run Code Online (Sandbox Code Playgroud)


Tru*_*ill 9

我会说他们(通常)都是糟糕的解决方案.静态类有一些用例,主要是简单实用的(C#3.0中的扩展方法).但是,随着任何程度的复杂性,可测试性问题开始出现.

假设A类依赖于静态类B.您希望单独测试A类.那很难.

所以你选择了Singleton.你有同样的问题 - A类依赖于单身B.你不能孤立地测试A类.

当B类具有其他依赖关系(例如命中数据库)或者是可变的(其他类可以改变其全局状态)时,问题会更加严重.

IoC(控制反转)容器库是解决此问题的一种方法; 它们允许您将Plain Old Classes定义为具有较长的使用寿命.当与模拟库结合使用时,它们可以使您的代码非常可测试.

  • +1静态类和单例是全局可访问的.全球是邪恶的:-) (3认同)

Cec*_*ame 6

静态类更容易实现 - 我已经看到C#中的线程安全单例的许多尝试采用了朴素锁定方案,而不是依赖于运行时保证的静态字段的一次性初始化(可选地在嵌套类内部来延迟实例化) ).

除此之外,我认为如果你需要传递对实现特定接口的对象的引用,那么单例是很好的,当'实现'应该是单例时,你不能用静态类做.