【发布时间】:2009-09-22 15:46:37
【问题描述】:
我有一个非常有趣的情况,我发现 .net 框架(任何版本)都无法实现单例模式
看看下面这段代码
namespace SingletonPattern
{
class Singleton
{
private static readonly Singleton instance = new Singleton();
private static int mcount = 0;
private Singleton() {
mcount += 1;
Console.WriteLine("Creating {0} instances of Singleton Class", mcount.ToString());
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
class program
{
static void Main()
{
for (int i = 0; i < 1000; i++)
{
System.Activator.CreateInstance(Type.GetType("SingletonPattern.Singleton"), true);
}
Console.ReadLine();
}
}
}
在 System.activator 的帮助下,任何伙伴都可以打破单例模式。
那么谁有风险?
任何编写许可组件的人,其中许可被实现为单例模式。
任何使用单例模式的基于服务器的代码。
也许我错了,或者我的发现没有意义,但我只是想分享并想知道你的观点?
【问题讨论】:
-
如果您使用单例来强制执行任何种安全性(例如防止违反许可证),那么您的代码(而不是单例)从根本上被破坏了。单例是一种设计模式,旨在使您的代码更易于维护(是否实现这是另一回事)。它从未打算强制执行或提供任何类型的安全性。通常,使用反射可以访问 all 私有成员,而不仅仅是构造函数。这并不意味着 .NET 框架已损坏。它提供了一些易于使用的功能,但它们从不假装“安全”
-
既然他在征求意见和意见,你为什么要投票给他。只是教育他(正如许多回答者所做的那样)。
-
如果功能导致一些不好的情况,它的用途是什么。但感谢您的投票和回复
-
问题是Activator.CreateInstance可以用在很多好的情况下,尤其是处理Reflection和动态加载/执行/创建类型。不幸的是,即使不是所有的好东西,大多数也可以重新用于邪恶的事情(至少在编程中)。
标签: .net singleton design-patterns