在静态还是 辛格尔顿问题已经在此之前多次讨论。
然而,所有的答案指出了一个单身的许多优点。
我的问题是 - 什么是在单一个静态类的优势是什么? 为什么不干脆选择单身每一次?
Answer 1:
静态类是你的箱子一个技术工具 - 基本上是一个语言功能。
辛格尔顿是一个建筑的概念。
您可以使用一个静态类,以实现单概念的一种手段。 或者,你可以使用一些其他的方法。
C#中的静态类有两个潜在的危险,如果你不小心。
- 所请求的资源不会被释放,直到应用程序生命的尽头
- 静态变量的值在应用程序中共享。 尤其糟糕的ASP.NET应用程序,因为这些值将居住在一个特定的应用领域网站的所有用户之间共享。
Answer 2:
从MSDN
静态类和类成员被用于创建可以在不创建该类的一个实例进行访问的数据和功能。 静态类成员可用于分离数据和行为独立于任何对象标识的:数据和功能并不不管发生了什么改变对象。 当有以依赖于对象标识类没有数据或行为静态类都可以使用。
关键的一点是,静态类do not require an instance reference
。 还要注意的是静态类是专门由语言和编译器启用。
辛格尔顿类实现只是用户编码类的Singleton设计模式。 单的目的是restrict instantiation of an class to a single instance
。
如果编码每一个静态类作为一个单身你必须每次使用它的时候实例化的类。
即
Console.WriteLine('Hello World');
会成为
Console c = Console.getInstance();
c.WriteLine('Hello World');
Answer 3:
我说,他们俩都(一般)贫困的解决方案。 有几个用例静态类,主要是简单的工具,那些(扩展方法在C#3.0浮现在脑海中)。 随着复杂性的任何程度,不过,可测性问题开始此起彼伏。
说A类取决于静态类B.你想测试A级隔离。 这很难。
所以,你去与辛格尔顿。 你有同样的问题 - A级依赖于单B.你不能孤立地测试A级。
当类B具有其他依赖(例如击打数据库)或是可变的(其它类可以改变它的全局状态)时,问题加剧。
IOC( 控制反转 )容器库是一个解决这个问题; 他们让你定义普通老式类为具有寿命长。 当带着嘲弄的库相结合,就可以使你的代码十分测试。
Answer 4:
静态类是实现要容易得多 - 我已经看到在C#线程安全的单身许多尝试,其使用,而不是依赖于运行时间的保证静态字段的一次性初始化天真锁定方案(可选的嵌套类延迟实例内)。
除此之外,我觉得单身是伟大的,如果你需要围绕基准传递到实现特定接口的对象,当“FPGA实现”应该是单身,一些东西,你不能用静态类做。
Answer 5:
我没有看到提到的一个考虑是,宁愿使用类的一个实例(单身,或者他们的DI相当值)的解决方案可以让你提供你的代码的其他用户可以定义扩展方法的类 - 因为只有扩展方法与非静态类的工作, this
参数。 换句话说,如果你有这样一行:
GlobalSettings.SomeMethod();
然后,语法,可以通过以下方式访问的唯一的事情GlobalSettings
是你提供的成员。 相反,如果GlobalSettings
是一个实例(单或以其他方式),那么消费者可能会加入自己的扩展GlobalSettings
,他们将无法不这样做:
application.GlobalSettings.CustomSomethingOrOther();
要么
GlobalSettings.Instance.CustomSomethingOrOther();