首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清理IDisposable资源

清理IDisposable资源
EN

Stack Overflow用户
提问于 2013-12-04 20:36:18
回答 4查看 242关注 0票数 1

现在我明白了,当我完成实现IDisposable的资源时,我应该调用Dispose()方法来清理资源。

我应该在多大程度上这样做。

我的例子是:

我正在用代码创建一个NotifyIcon,所以我这样做:

代码语言:javascript
复制
var icon = new Icon(...);
var contextMenu = new ContextMenu(...);
var contextMenuButton1 = new MenuItem(...);
var contextMenuButton2 = new MenuItem(...);
var contextMenuButton3 = new MenuItem(...);
// ...
var notifyIcon = new NotifyIcon(...);

所有这些都有一个Dispose()方法。通常,我只会保留对notifyIcon的引用,并将其处理掉。

但是,它不会处理图标或上下文菜单或它的项,所以我是否应该保留对所有内容的引用,或者至少有一个List<IDisposable>

或者,由于这些对象的作用域,我是否可以假定垃圾收集器将为我调用dispose (当我处理NotifyIcon时)?

EN

回答 4

Stack Overflow用户

发布于 2013-12-04 20:42:37

这在很大程度上取决于场景。例如,在许多UI框架中,向父控件/容器添加像菜单项或图标这样的东西会让父控件承担起对该项的责任。因此,处理父级将同时处理所有祖先。因此:如果我们假设您正在创建的这些新控件将被添加到UI中,那么否:您通常不需要手动执行任何操作。然而,如果你经常添加/删除控件,那么你需要弄清楚什么时候你拥有一个元素的所有权(例如,如果你从UI中移除它,它现在是“你的”,而不是UI的--这是你的责任来处理它)。

票数 2
EN

Stack Overflow用户

发布于 2013-12-04 20:41:13

通常,这就是using语句的用途,例如:

代码语言:javascript
复制
using (var icon = new Icon(...))
{
}

using语句在结束时立即调用Dispose方法(即使内部有异常,它仍然会正确地处理变量)。你甚至可以“链接”它们来减少嵌套:

代码语言:javascript
复制
using (var icon = new Icon(""))
using (var icon2 = new Icon(""))
using (var icon3 = new Icon(""))
{

}

您希望尽快调用Dispose。如果不这样做,它仍然会在某个时刻被调用,通常是在对象的终结化期间,但那可能已经太晚了(例如,释放一个文件句柄将允许打开另一个文件句柄,而如果您没有及时释放它,第二次调用将抛出异常)。

之所以有Dispose方法,首先是因为图标在后台有一些本机资源(它使用本机图标对象,这都与Windows和GDI+相关)。这些资源是“稀缺的”(一个更好的例子是文件句柄),因此你不想等待GC最终收集它们-这会更昂贵(如果广泛地完成,终结会有很大的代价),并且可能会阻止对资源的访问(即使使用Icon,我记得有一个问题,你只能为每个进程分配这么多本机位图,那么你就会挨饿)。

如果您不关心成本,如果资源不够稀缺而无关紧要,如果usingDispose带来的麻烦超过了它的价值,那么您就不必调用Dispose。它最终会被调用。

例如,您应该经常手动调用dispose :文件、流、套接字、大的本机内存块。

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 21:01:18

来自MSDN:`

创建新的NotifyIcon时,...它将一直存在,直到它的容器将其释放到垃圾回收。

如果您使用的构造函数接受一个容器(通常是一个Form拥有的System.ComponentModel.Container),那么Dispose将在容器被释放时被调用-即当窗体被关闭时。

上面链接的MSDN文档中的示例以这种方式使用窗体的容器。

如果您使用默认构造函数,则没有容器,您将不得不自己管理NotifyIcon的生命周期,并在完成时处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20375569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档