我的问题可能更多地与语义有关,而不是与实际使用有关IDisposable
。我正在致力于实现一个单例类,该类负责管理在应用程序执行期间创建的数据库实例。当应用程序关闭时,应删除该数据库。
现在我正在处理这个删除Cleanup()
应用程序在关闭时调用的单例方法。当我正在编写文档时Cleanup()
让我震惊的是我正在描述什么Dispose()
方法应该用于清理资源。我原本没有实施IDisposable
因为它在我的单例中似乎不合适,因为我不想让任何东西来处理单例本身。目前还没有,但将来可能会有这样的原因Cleanup()
可能会被调用,但单例应该仍然存在。我想我可以包括GC.SuppressFinalize(this);
在 Dispose 方法中使其可行。
因此,我的问题是多方面的:
1)正在实施IDisposable
对于单身人士来说根本上是个坏主意?
2)我只是在这里混合语义吗Cleanup()
代替Dispose()
既然我正在处置资源,我真的应该使用处置吗?
3) 将实施“Dispose()”GC.SuppressFinalize(this);
这样做,这样我的单例实际上不会被破坏,以防我希望它在调用清理数据库后继续存在。
-
为单例实现 IDisposablemight如果您使用 CAS 技术而不是锁来创建单例,这是一个好主意。像这样的东西。
if (instance == null) {
var temp = new Singleton();
if (Interlocked.CompareExchange(ref instance, temp, null) != null) &&
temp is IDisposable) {
((IDisposable)temp).Dispose();
}
}
return instance
我们创建了一个临时对象并尝试了原子比较和交换,因此如果它实现了 IDisposable 并且没有写入实例的位置,我们需要处置这个临时对象。
避免锁可能是件好事,但如果使用一些繁重的逻辑在其构造函数中创建单例实例,则会产生一点开销。
-
如果您不希望其他代码清理或处置您的对象,请不要为此提供任何机会。然而,它might如果您使用惰性初始化,那么提供某种reset()方法以允许单例重新创建自身是个好主意。像这样的事情:
public static Singletong GetInstance() {
if (instance == null) {
instance = new Singleton(); //here we re-evalute cache for example
}
return instance
}
public static void Reset() {
instance = null;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)