往往会发生的情况是,如果该物品纯粹是managed资源,调用dispose不一定required, 但是强烈建议因为它使处置确定性的。它并不总是必需的(从技术意义上来说),因为这些托管资源本身现在可能有资格进行 GC,或者默认情况下实际上没有什么可处置的,这是一个可扩展点。
For 不受管理的资源,处置模式 http://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-P建议实施终结器,它将在 GC 上调用。如果类型没有实现终结器并且没有调用 dispose,那么它是possible(嗯,很有可能)资源将得不到处理。终结器是运行时提供的最后一次清理你的东西的机会 - 它们也是有时间限制的。
注意,它does not使 GC 或托管内存回收具有确定性,处置是not delete
来自 C++。废弃的物品距离真正被收集可能还有很长的路要走。然而,在托管世界中,您不关心确定性收集,只关心资源管理 - 换句话说,处置。
也就是说,我总是确保调用 Dispose 或使用using
声明类型是否是一次性的,不管是否使用托管资源或非托管资源 - 这是预期的约定:
public void Show()
{
using (var f = new Form1())
{
f.ShowDialog();
} // Disposal, even on exceptions or nested return statements, occurs here.
}
Update:
在与 Servy 讨论后,我觉得我必须表达这一点,作为我建议尽可能处置的理由。如果是MemoryStream
,明明是一次性的类型,但实际上目前并没有处理任何东西。
然而,依靠这一点,就等于依靠执行 of MemoryStream
。如果将其更改为包含非托管资源,则这将意味着依赖于MemoryStream
没有任何东西可以处理就会成为问题。
在可能的情况下(如IDisposable
)我更喜欢依赖公共合同。在这种情况下,按照合同进行工作意味着我不会受到底层实施更改的影响。