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

时间:2018-03-22 12:37:24

标签: c# list memory dispose

来自list.Clear()

上的MSDN文档
  

Count设置为0,并且还会释放对集合元素中其他对象的引用。

从我所教过的(可能是错的),处理过的&发布的是不同的东西。 Disposed表示项目已从内存中完全删除,释放意味着它不会被指针绑定到该列表。

这是否意味着我需要做

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

如果我有效地希望完全销毁/清除/释放/删除列表?

对我而言,它应该像.Clear()一样简单,但是,如果这是足够和正确的话,对我来说有点不清楚(双关语)。

请注意,我们并未覆盖Dispose()Clear(),这是所有默认实施。

此外,列表是List<T>

编辑:根据评论建议,我已经去检查过,这些项目都是IDisposables,这可以说明他们应该被处置

What is IDisposable for? 重复澄清:

我不认为这两个问题是相同的,我的问题是两件事之间的区别,另一个是要求澄清其中一件事。在我决定写这个问题之前,它也没有出现在我的搜索中,因为我过于专注于像#34;差异配置与清除&#34;这样的关键字,这可能也是未来寻找答案的开发人员的情况。我承认其他答案提供了更多信息,是一个很好的链接,可以在这里添加。

3 个答案:

答案 0 :(得分:2)

不,List<T>.Clear没有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();

答案 1 :(得分:1)

  

从我所教过的(可能是错的),处理过的&amp;发布的是不同的东西。

真。

  

Disposed意味着项目已从内存中完全删除,释放意味着它不会被指针绑定到该列表。

错误。 Disposed意味着完成与托管内存无关的对象所需的任何清理。

如果元素是IDisposable,那么在清除之前Dispose()所有元素确实是一个好主意,如果它们通常是通过该列表到达的,那么其他任何内容都不会Dispose()

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

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

答案 2 :(得分:0)

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

只是一个提示:当您使用语句代码时基本上不需要包含Dispose()方法

using(var someResource = new SomeResource()){
    // Some galaxy logic here
}

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