我是否需要在清除 c# 列表之前处理项目?

Do I need to Dispose items in a c# list before clearing it?

来自 list.Clear()

上的 MSDN 文档

Count is set to 0, and references to other objects from elements of the collection are also released.

根据我所学的(可能是错误的),处理和释放是不同的东西。 Disposed 意味着项目完全从内存中删除,released 意味着它根本没有通过指针绑定到该列表。

这是否意味着我需要做

foreach (var item in Items)
{
    item.Dispose();
}
this.Items.Clear();

如果我想要完全 destroy/clear/release/dipose 一个存在的列表?

对我来说,它应该像 .Clear() 一样简单,但是,我有点不清楚(双关语意)是否足够和正确。

请注意,我们没有覆盖 Dispose() 也没有覆盖 Clear(),它们都是默认实现。

此外,列表是 List<T>

编辑:根据评论推荐,我去检查过,所有物品都IDisposables,这说明了应该处理它们的事实

重复说明 IDisposable 的用途是什么? :

我不认为这两个问题是一样的,我的是问两件事之间的区别,另一个是要求澄清其中一件事。在我决定写这个问题之前它也没有出现在我的搜索中,因为我太专注于像 "difference dispose vs clear" 这样的关键字,这可能也是未来开发人员寻找答案的情况。我承认另一个答案提供了更多信息,可以很好地 link 添加到此处。

From what I've been taught (which could be wrong), disposed & released are different things.

正确。

Disposed means the items is completely removed from memory, released means it's simply not bound to that list by pointer.

错了。 Disposed 意味着任何与托管内存无关的对象所需的clean-up都已完成。

如果元素是 IDisposable 那么在清除之前将它们全部 Dispose() 确实是个好主意,如果它们通常是通过该列表到达的,因此没有其他东西会 Dispose()他们。

如果它们不是 IDisposable 这不仅不需要,而且不可能。

如果它们是 IDisposable 但其他东西仍将使用这些元素,那么您不应该 Dispose() 它们,因为那样会破坏其他用途。

否,List<T>.Clear does not dispose 个对象。如果你愿意,你可以写一个扩展:

public static class IEnumerableExtensions
{
    public static void DisposeAll<T>(this IEnumerable<T> seq) where T : IDisposable
    {
        foreach (T d in seq)
            d?.Dispose();
    }
}

var connections = new List<SqlConnection>();
// ...
connections.DisposeAll();

据我所知,Dispose()在某些方面非常有用,比如如果你正在处理资源并且你想清除内存中的那些资源或者如果发生任何异常,你肯定需要处理掉那个。

提示:当您使用像

这样的语句代码时,您基本上不需要包含 Dispose() 方法
using(var someResource = new SomeResource()){
    // Some galaxy logic here
}

因为它有Dispose机制。如果这些资源不受 CLR 管理,那么使用 using 语句将是一个简单的选择。