c# - List<T>.Clear - 是否必须调用它?

标签 c# generics garbage-collection list

过去一周我一直在解决项目中的另一个内存问题。我尝试了几个内存分析器,但没有任何东西能让我深入了解导致轻微内存泄漏的原因。事实证明,以下代码是导致此问题的原因:

private void DeleteAll( FlowLayoutPanel flp)
{
    List<ImageControl> AllList = GetAllList(flp);
    List<ImageControl> LockedList = GetLockedList(flp);

    for (int i = 0; i < LockedList.Count; i++)
    {
        AllList.Remove(LockedList[i]);
    }

    flp.SuspendLayout();

    for (int i = 0; i < AllList.Count; i++)
    {
        flp.Controls.Remove(AllList[i]);
    }

    DisposeList(AllList);

    flp.ResumeLayout();

}

在代码中,ImageControl是一个UserControl,上面的整个方法只是从FlowLayoutPanel中删除ImageControl。 DisposList() 方法只是为传递给它的列表中的所有控件调用 ImageControl.Dispose()。

现在,我认为一旦该方法退出,AllList 将超出范围,因此它对 ImageControl 的所有引用都将不存在。所以 GC 会做它的事情。但事实并非如此。我发现它需要

AllList.Clear();

在 AllList 超出范围之前添加到 DeleteAll() 方法的末尾。

那么您是否必须始终显式清除通用列表以释放资源?还是我上面做错了什么?我想知道,因为我在这个项目中大量使用了临时列表。

好的,这是 GetAllList 方法。对我来说似乎不是问题:

private List<ImageControl> GetAllList(FlowLayoutPanel flp)
{
    List<ImageControl> List = new List<ImageControl>();

    for (int i = 0; i < flp.Controls.Count; i++)
    {
        List.Add((ImageControl)flp.Controls[i]);
    }

    return List;
}

顺便说一句,如果您在这里看到我的最后几个主题,我一直在与内存泄漏作斗争,以成为一名熟练的 C# 程序员:) 我添加了 DisposeList() 方法,因为我已经阅读过 Dispose() 应该被调用在任何实现 IDisposable 的对象上,UserControl 就是这样做的。我还需要一种方法来修复 ToolStrip 类(ImageControl 包含的)的“错误”,该错误会导致资源保留,除非在销毁之前将 Visible 属性设置为 false。因此,我重写了 ImageControl 的 Dispose 方法来做到这一点。

哦,DisposeList() 也会取消订阅事件处理程序:

private void DisposeList( List<ImageControl> IC )
{
    for (int i=0;i<IC.Count;i++)
    {
        IC[i].DoEvent -= ImageButtonClick;
        IC[i].Dispose();
    }
}

最佳答案

如果AllList是对列表和列表中元素的唯一引用,那么一旦退出DeleteAll,列表及其所有元素将有资格进行垃圾回收。方法。

如果调用AllList.Clear()有所不同,那么我会得出结论,在代码中的其他地方存在对同一列表的引用。也许仔细看看 GetAllList() 方法会给出线索。

关于c# - List<T>.Clear - 是否必须调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077414/

相关文章:

java - 在displayMethod中使用printf和forEach,如何更改单个数组显示的间距

swift - 使用索引(:) on Array of Protocol Type in Swift

python - python什么时候删除变量?

Java 虚拟机内部结构

c# - 同一解决方案中的项目的 Visual Studio PDB 文件未生成

c# - Windows Phone定时重复方法(类似IOS中的NSTimer)

c# - 为什么通过 C# AWS SDK 将文件上传到 s3 会出现权限被拒绝错误?

c# - 警报弹出窗口中的换行符

c# - 如何在 C# 中获取传递给 T 的属性类型?

java - JVM 垃圾回收问题