gpt4 book ai didi

c# - Form.ShowDialog() 并处理

转载 作者:太空狗 更新时间:2023-10-29 17:31:41 25 4
gpt4 key购买 nike

如果我有这样的方法:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com