gpt4 book ai didi

.net - 我需要在托管对象上调用 Dispose() 吗?

转载 作者:行者123 更新时间:2023-12-03 09:41:13 24 4
gpt4 key购买 nike

我不敢相信我仍然对此感到困惑,但无论如何,让我们最终确定它:

我有一个覆盖 OnPaint 的类来做一些绘图。为了加快速度,我事先在构造函数中创建了笔、画笔等,这样 OnPaint 就不需要继续创建和处理它们。

现在,我确保我总是处理这些对象,但我觉得我不需要,因为尽管它们实现了 IDisposable,但它们是托管对象。

这样对吗?

感谢所有的答案,这个问题肯定已经解决了。
我很高兴我一直保持警惕,总是使用“使用”,这样我就不需要检查所有的代码了。我只是想明确一点,我不是一个毫无意义的用户。

顺便说一句,最近我确实遇到了一个奇怪的情况,我不得不替换一个 using 块并手动调用 dispose!我会挖掘出来并创建一个新问题。

最佳答案

这是不正确的。您需要处理实现 IDisposable 的对象.这就是为什么他们实现 IDisposable - 指定它们包装(直接或间接)非托管资源的事实。

在这种情况下,非托管资源是一个 GDI 句柄,如果您在实际处理完它们后没有处理它们,就会泄漏这些句柄。现在,这些特定对象具有终结器,它们会在 GC 启动时导致资源被释放,但您无法知道什么时候会发生。可能是 10 秒后,也可能是 10 天后;如果您的应用程序没有产生足够的内存压力来导致 GC 启动并在这些画笔/钢笔/字体/等上运行终结器,那么在 GC 意识到发生了什么之前,您可能最终导致操作系统缺乏 GDI 资源。

此外,您无法保证每个非托管包装器实际上都实现了终结器。 .NET Framework 本身在实现 IDisposable 的类的意义上非常一致。使用 correct pattern 实现它,但其他一些类完全有可能具有不包含终结器的损坏实现,因此除非 Dispose 否则无法正确清理。被显式调用。一般而言,IDisposable的目的是你不应该知道或关心具体的实现细节;相反,如果它是一次性的,那么你就扔掉它,句号。

故事寓意:永远处置IDisposable对象。如果您的类(class)“拥有” IDisposable 的对象,那么它应该实现 IDisposable本身。

关于.net - 我需要在托管对象上调用 Dispose() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548664/

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