这是我从“CLR via C#”、“Effective C#”和其他资源中对 IDisposable 和终结器的理解:
- IDisposable 用于确定性地清理托管和非托管资源。
- 负责非托管资源(例如文件句柄)的类应实现 IDisposable 并提供终结器以确保即使客户端代码未在实例上调用 Dispose() 也能清理它们。
- 只负责托管资源的类不应该实现终结器。
- 如果你有一个终结器,那么你必须实现 IDisposable(这允许客户端代码做正确的事情并调用 Dispose(),而终结器可以防止在他们忘记时泄漏资源)。
虽然我理解并同意上述所有内容,但在一种情况下,我认为打破这些规则是有意义的:一个负责非托管资源的单例类(例如提供对特定文件的单点访问) )。
我认为在单例上使用 Dispose() 方法总是错误的,因为单例实例应该在应用程序的整个生命周期内都存在,如果有任何客户端代码调用 Dispose() 那么你就被塞满了。但是,您需要一个终结器,以便在卸载应用程序时终结器可以清理非托管资源。
因此,在我看来,拥有一个带有不实现 IDisposable 的终结器的单例类似乎是一件合理的事情,但这种类型的设计与我所理解的最佳实践背道而驰。
这是一个合理的方法吗?如果不是,为什么不呢?有什么更好的选择?