gpt4 book ai didi

c# - 在单例上使用 Dispose 来清理资源

转载 作者:太空狗 更新时间:2023-10-29 19:59:07 26 4
gpt4 key购买 nike

我的问题可能更多地与语义有关,而不是与 IDisposable 的实际使用有关。我正在努力实现一个单例类,该类负责管理在应用程序执行期间创建的数据库实例。当应用程序关闭时,这个数据库应该被删除。

现在,我通过应用程序在关闭时调用的单例的 Cleanup() 方法处理此删除操作。当我为 Cleanup() 编写文档时,令我震惊的是我正在描述应该使用什么 Dispose() 方法,即清理资源。我最初没有实现 IDisposable 因为它在我的单例中似乎不合适,因为我不想要任何东西来处理单例本身。目前没有,但将来可能是调用此 Cleanup() 的原因,但单例应该仍然存在。我想我可以在 Dispose 方法中包含 GC.SuppressFinalize(this); 以使其可行。

因此我的问题是多方面的:

1) 在单例上实现 IDisposable 从根本上说是个坏主意吗?

2) 我是不是只是通过使用 Cleanup() 而不是 Dispose() 来混合语义,因为我正在处理资源,所以我真的应该使用 dispose ?

3) 将使用 GC.SuppressFinalize(this); 实现“Dispose()”,这样我的单例就不会真正被销毁,以防我希望它在调用 clean-建立数据库。

最佳答案

  1. 如果您使用 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 并且它没有写入实例的位置,我们需要处置这个临时对象。

    避免锁定可能是件好事,但如果在其构造函数中使用一些繁重的逻辑来创建单例实例,这也会带来一些开销。

  2. 如果您不希望其他代码清理或处置您的对象,请不要为此提供任何机会。但是,可能提供某种 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com