- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我有这样的方法:
public void Show()
{
Form1 f = new Form1();
f.ShowDialog();
}
我是否仍然需要在表单上调用 dispose,即使它超出范围,这将有资格进行垃圾收集。
根据一些测试,多次调用此 Show() .. 在某些时候,GC 似乎收集了它,因为我可以看到内存激增然后在某个时间点下降。
从 MSDN 看来,您必须在不再需要表单时调用 dispose。
最佳答案
如果项目具有纯粹的托管资源,则往往会发生这种情况,调用处置不一定必需,但强烈建议 因为它使处置确定性。它并不总是必需的(在技术意义上),因为这些托管资源现在可能本身就有资格进行 GC,或者默认情况下实际上没有什么可处理的,它是一个可扩展点。
对于非托管资源,Dispose Pattern建议实现一个 finalizer,它将在 GC 上调用。如果类型未实现终结器且未调用处置,则可能(好吧,很有可能)资源将处于未处理状态。终结器是运行时提供的最后一次清理你的东西的机会——它们也是有时间限制的。
请注意,它不会使 GC 或托管内存回收具有确定性,处置不会从 C++ 中删除
。废弃的元素可能离实际收集还有很长的路要走。然而,在托管世界中,您不关心确定性收集,只关心资源管理 - 换句话说,处置。
也就是说,如果类型是一次性的,我总是确保调用 Dispose 或使用 using
语句,不管它是使用托管资源还是非托管资源 - 它是预期的约定:
public void Show()
{
using (var f = new Form1())
{
f.ShowDialog();
} // Disposal, even on exceptions or nested return statements, occurs here.
}
更新:
在与 Servy 讨论后,我觉得我必须表达这一点,作为我建议尽可能处置的理由。对于MemoryStream
,它显然是一次性类型,但实际上目前不处理任何东西。
而依赖于此,就是依赖于MemoryStream
的实现。如果将其更改为包含非托管资源,这将意味着依赖 MemoryStream
没有任何可处理的内容会出现问题。
在可能的情况下(如 IDisposable
的情况)我更愿意依赖公共(public)契约(Contract)。在这种情况下违背契约(Contract)意味着我不会受到底层实现变更的影响。
关于c# - Form.ShowDialog() 并处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11454291/
我是一名优秀的程序员,十分优秀!