【问题标题】:RemoveAt(x); Does it dispose the element x?删除At(x);它会处理元素 x 吗?
【发布时间】:2013-04-17 09:30:42
【问题描述】:

每次用户单击下一张图像时,我都有一个缓存来存储最近的两张图像,“RemoveAt(x)”是否会处理 x 图像,或者我想要的是删除的图像不在内存中.完全删除。

 List<Image> BackimageList = new List<Image>();

 private void BackimageListCache(Image img)
{
  BackimageList.Add(img);
  if (BackimageList.Count > 2) 
   {
    BackimageList.RemoveAt(0); //oldest image has index 0
   }
}

【问题讨论】:

    标签: c# winforms image list


    【解决方案1】:

    .NET 中的集合不“拥有”一个对象。所以他们不能假设该对象没有在其他任何地方使用,因此他们不能处置该对象。所有权规则完全由您自己实施。这确实意味着您还必须确保图像不会显示在 PictureBox 中。

    确保图像不再占用任何内存也是不确定的。你不能自己管理内存,这是垃圾收集器的工作。但是,Image 使用相当大量的非托管内存来存储像素数据,当您调用 Dispose() 时,该内存确实会被释放。 Image 的托管部分保留在内存中,直到 GC 到达它。它很小。

    【讨论】:

    • 你是对的,资源正在其他地方使用,但我决定现在将其设置为 null 并希望变得更好。我是初学者,我想我离理解GC和Dispose还有很长的路要走。
    • 非托管部分可能也会在 GC 到达时被清理掉;我确定 Image 有一个正确编写的终结器。当然,per Raymond Chen,“一个正确编写的程序不能假设终结器会运行。”显然,最好在不再需要图像后立即处理它,而不是在 GC 到达它时/如果它。
    【解决方案2】:

    RemoveAt 方法不会在图像上调用Dispose。在致电RemoveAt 之前,您必须自己处理它。

    编辑

    如果该类型实现了IDisposable,那么你可以编写来处理它

    BackImageList[0].Dispose();
    BackImageList.RemoveAt(0);
    

    RemoveAt(0) 本质上是:

    for (int i = 1; i < BackImageList.Count; ++i)
    {
        BackImageList[i-1] = BackImageList[i];
    }
    BackImageList.Count--;
    

    当然,这一切都是在内部完成的。您不能设置 Count 属性。这是通过RemoveAt 方法完成的。

    在调用RemoveAt之前无需将值设置为null

    【讨论】:

    • 感谢您的建议 通过调用 Dispose(0) 我发现该资源正在其他地方使用,因为我遇到了异常。所以我决定在删除之前将其设置为空。 BackimageList[0]=null; BackimageList.RemoveAt(0);我希望在用户决定浏览 1000 张图片时可以节省内存
    • [0] == nullRemoveAt(0) 不是同一个东西吗?
    • @JimMischel:我面前没有参考源,但我不希望RemoveAt 包含BackImageList[0] = null;。在循环的第一次迭代期间用BackImageList[1] 覆盖BackImageList[0] 足以完成此任务。
    • @JimMischel:感谢您的回复。我需要确保 BackImageList.Count 不超过 2,我在程序的某个地方使用了该条件。如果我不使用 RemoveAt,即使某些元素为空,列表也会继续增长。
    • @Brian:你说得对:BackImageList[0] = null; 不行。我试图说它删除了引用,这就是我说“基本上”的原因。我想我的说法相当混乱。谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2017-01-18
    • 2023-03-09
    相关资源
    最近更新 更多