我刚刚开始使用 .NET 框架。今天,我学习了IDisposable
接口和dispose()
方法。我被教导了一些关于它的事情:
dispose()
应包含与对象对应的清理代码(如关闭任何对象占用的任何资源 - 文件或数据库连接等)
我还被告知,如果我们不在dispose()
方法中执行此操作,则可以在析构函数中执行相同的操作,但这并不能确保立即执行,我们只能任由 GC 摆布。
如果我们根本不提供任何清理代码,GC 将强制终止与我们的对象持有的资源的所有连接。因此,我们应该自己处理清理代码。
但我很好奇为什么 CLR 不自己处理这个问题?它负责内存管理,负责垃圾收集。因此,它应该非常清楚哪个对象持有哪个资源以及该对象何时消亡。那么,它也应该能够重新分配这些资源?
我问了几个人。我得到的答案是因为我们需要优雅地关闭它,而 GC 会强制关闭它。真的是这个原因吗?