为什么要在退出应用程序时释放对象?

Why dispose an object when exiting an application?

为什么我们在退出应用程序时释放对象?理论上,我们关闭程序时,它不会被处理掉吗?

如果没有,如果不处理,它会对性能有多大影响,即它在运行时使用的 RAM 量?

如果你认真对待 IDisposable contract 那么,不,在程序终止之前处理任何东西是没有意义的。作为关闭过程的一部分,CLR 运行任何剩余对象的终结器。因此无论如何都会进行清理,调用 Dispose() 不会使其更快并且对资源使用根本没有影响。

然而,提醒一下是合适的。合同并不总是按照预期的方式使用。在使用对象后必须进行一些清理是很常见的,而且很容易忘记这样做。特别是 Using 语句 非常 有吸引力 semi-automatic。你可以在 this answer 中看到我滥用它。我选择它是因为它很方便而且不可能不注意到你忘记处理了。一个非常无辜的小谎。但它并不总是那么无辜。例如,使用 Dispose() 取消订阅事件是一种非常常见的犯罪行为。不是无辜的,当客户端程序员不处理时,这是一个泄漏。尽管在程序关闭时跳过它仍然不是错误。但情况可能更糟,例如删除文件或向另一台机器发送 "goodbye" 消息。

所以粗略的指导是,无论如何您都不必为处理垃圾而后悔,养成这是一个好习惯。特别是如果它是别人的代码。但如果是 .NET Framework class,我现在想不出它滥用契约的具体案例。

尽管在正常情况下,允许系统正确折叠应用程序并释放资源和文件锁等通常就足够了,但还有其他原因可能导致您 运行 在终止时进行处置一个应用程序。

例如,如果您正在连接到远程位置或数据库并已检出某种密钥,正确的终止应该包括返回该密钥并正确关闭另一端的连接。

此外,您可能将临时文件用于日志记录或其他目的。在您的应用程序退出时也清除它们是良好的编程方式。