【发布时间】:2018-03-22 12:37:24
【问题描述】:
来自 list.Clear() 上的 MSDN 文档
Count 设置为 0,同时释放集合元素对其他对象的引用。
根据我所学到的(可能是错误的),处置和释放是不同的事情。 Disposed 意味着项目完全从内存中删除,release 意味着它根本没有通过指针绑定到该列表。
这是否意味着我需要这样做
foreach (var item in Items)
{
item.Dispose();
}
this.Items.Clear();
如果我想彻底销毁/清除/释放/丢弃一个列表?
对我来说,这一切都应该像 .Clear() 一样简单,但是,我有点不清楚(双关语)这是否足够和正确。
请注意,我们没有覆盖 Dispose() 或 Clear(),它们都是默认实现。
此外,列表是List<T>。
编辑:根据评论建议,我已经检查过,这些项目都是IDisposables,这揭示了它们应该被丢弃的事实
重复澄清What is IDisposable for? :
我不认为这两个问题是相同的,我的问题是问两件事之间的区别,另一个是要求澄清其中一件事。在我决定写这个问题之前,它也没有出现在我的搜索中,因为我过于关注“difference dispose vs clear”这样的关键字,这可能也是未来开发人员寻找答案的情况。我承认另一个答案提供了更多信息,并且是在此处添加的一个很好的链接。
【问题讨论】:
-
如果没有更多的对象引用,它们将被收集。
-
Disposed 意味着任何非托管资源都被释放,根据
IDisposable.Dispose。它与自动管理的内存完全无关。如果您的列表包含实现IDisposable类型的对象,那么是的,您应该调用它。 -
是的,如果您想处理它们,请处理它们。
-
简短的回答是“视情况而定”。
Items中有哪些项目?他们是怎么到那里的? 只有当您 100% 确定Disposed 的对象没有在其他地方使用时,调用Dispose才是安全的。 -
你需要引入和考虑“所有权”的概念。如果您的列表拥有这些对象,并且它们实现了
IDisposable,那么是的,您需要在将它们从列表中删除之前处置这些对象。如果从列表中删除它们是转移所有权的行为,例如将它们添加到不同的列表中,那么不,在这种情况下,您不应该处置它们。您的这部分问题确实没有明确的答案。