gpt4 book ai didi

c# - 调用 Dispose() 后图标仍然可用吗?

转载 作者:太空狗 更新时间:2023-10-29 22:08:30 26 4
gpt4 key购买 nike

我一直在尝试在一些遗留问题的地方正确使用 Dispose 来整理我们的一些代码。一旦这样的实例是图标,并且我注意到一些我认为很奇怪的东西,如果我调用 Icon.Dispose() 我仍然能够使用图标。

所以我将它提取到一个小的控制台应用程序中,我完全预计它会崩溃(抛出 ObjectDisposedException),但它并没有...我是否误解了 dispose 应该在这里做什么?

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.IO;

namespace DisposeTest
{
class Program
{
static void Main(string[] args)
{
Icon icon = new Icon(@"C:\temp\test.ico");
icon.ToBitmap().Save(@"C:\temp\1.bmp");
icon.Save(new FileStream(@"C:\temp\1.ico", FileMode.OpenOrCreate, FileAccess.ReadWrite));
icon.Dispose();
GC.Collect(); // Probably not needed, but just checking.
icon.Save(new FileStream(@"C:\temp\2.ico", FileMode.OpenOrCreate, FileAccess.ReadWrite));
icon.ToBitmap().Save(@"C:\temp\2.bmp");
}
}
}

最佳答案

I extracted it out into a little console application that I fully expected to crash, but it didn't. Am I mis-understanding what dispose should be doing here?

包含不良编程习惯的程序不需要崩溃和燃烧。如果他们这样做当然很好,但他们不必这样做。据我所知,该文档并未说明“如果您使用处置图标,程序会崩溃”是该库支持的功能,因此您不能依赖它。

(如果文档确实在某个地方说明了这一点,那么您就发现了一个错误;如果您想在 Connect 上报告它,我们将不胜感激。)

对于人们似乎觉得有趣的相关问题,请参阅这个关于利用 C 中的非崩溃行为的问题:

Can a local variable's memory be accessed outside its scope?

最后,您的评论是正确的,注意到垃圾收集器可能不相关。请记住,“处置”的目的是丢弃非托管 资源。垃圾收集器的要点是丢弃托管内存并通过终结器丢弃非托管资源。由于图标的内存仍然存在(无论如何处理程序都可能会抑制完成),因此在此处强制进行垃圾收集不太可能做任何事情。

关于c# - 调用 Dispose() 后图标仍然可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7078588/

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