我在我的课程中只有一个副本。我不想使用Singleton模式,原因有很多(*见下文)。我知道我只会有一个类的副本,因为我将是唯一一个调用它的构造函数。这是一个很好的方法来检查是否只有一个类的实例存在,而不诉诸使用Singleton模式?
在我的类的构造函数中,我想检查该类的只有一个副本是否存在,并在存在多个类时抛出异常。下面的代码是否适合用于这种情况?
public class MySingletonAlternative : IDisposable
{
private static int _count = 0;
public MySingletonAlternative()
{
int newValue = System.Threading.Interlocked.Increment(ref _count);
if (newValue > 1)
{
throw new NotImplementedException();
}
}
public void Dispose()
{
int newValue = System.Threading.Interlocked.Decrement(ref _count);
if (newValue < 0)
{
throw new ObjectDisposedException("MySingletonAlternative");
}
}
}
*我为什么不想使用单例:
我希望能够创建该类时控制。在传统的C#单例模式中,构造发生非确定性。
我想避免全局变量。
当我调试我的代码并在Singleton的私有构造函数中引发异常时,Visual Studio会突出显示该异常,但它会突出显示错误的代码行,通常位于不同的文件中。
我不想懒惰地创建这个对象(使用Lazy <T>)。这个类的一个实例将存在于我的应用程序的生命中。我通过懒惰地构建它而获益匪浅。
如果你有一个静态构造函数,正常单的建设是完全确定的。而你仍然有一个全局变量:计数器。一点也不清楚*为什么*要阻止创建多个实例。这有一些单身模式的缺点(例如缺乏可测试性),没有一些可疑的好处。 –
根据http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx用户无法控制何时在程序中执行静态构造函数。另外,我不会将全局计数器考虑到我宣布它是私密的。 – user2023861
这只是不真实的。对于没有存在静态构造函数的类型,它的类型初始值设定项有些* true,但是当存在静态构造函数时,C#规范非常明确:“执行静态构造函数是由以下事件中的第一个触发的:应用程序域: - \t创建类类型的实例 - 引用任何类类型的静态成员。“ –