- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题可能更多地与语义有关,而不是与 IDisposable
的实际使用有关。我正在努力实现一个单例类,该类负责管理在应用程序执行期间创建的数据库实例。当应用程序关闭时,这个数据库应该被删除。
现在,我通过应用程序在关闭时调用的单例的 Cleanup()
方法处理此删除操作。当我为 Cleanup()
编写文档时,令我震惊的是我正在描述应该使用什么 Dispose()
方法,即清理资源。我最初没有实现 IDisposable
因为它在我的单例中似乎不合适,因为我不想要任何东西来处理单例本身。目前没有,但将来可能是调用此 Cleanup()
的原因,但单例应该仍然存在。我想我可以在 Dispose 方法中包含 GC.SuppressFinalize(this);
以使其可行。
因此我的问题是多方面的:
1) 在单例上实现 IDisposable
从根本上说是个坏主意吗?
2) 我是不是只是通过使用 Cleanup()
而不是 Dispose()
来混合语义,因为我正在处理资源,所以我真的应该使用 dispose ?
3) 将使用 GC.SuppressFinalize(this);
实现“Dispose()”,这样我的单例就不会真正被销毁,以防我希望它在调用 clean-建立数据库。
最佳答案
如果您使用 CAS 技术而不是锁来创建单例,则为单例实现 IDisposable可能是个好主意。像这样。
if (instance == null) {
var temp = new Singleton();
if (Interlocked.CompareExchange(ref instance, temp, null) != null) &&
temp is IDisposable) {
((IDisposable)temp).Dispose();
}
}
return instance
我们创建了一个临时对象并尝试了原子比较和交换,所以如果它实现了 IDisposable 并且它没有写入实例的位置,我们需要处置这个临时对象。
避免锁定可能是件好事,但如果在其构造函数中使用一些繁重的逻辑来创建单例实例,这也会带来一些开销。
如果您不希望其他代码清理或处置您的对象,请不要为此提供任何机会。但是,可能提供某种 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;
}
关于c# - 在单例上使用 Dispose 来清理资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931302/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!