RemoveAt移除(X);它是否处理元素x?

时间:2013-04-24 01:02:24

标签: c# winforms image list

每次用户点击下一张图像时,我都有一个Cache来存储最近的两张图像,“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
   }
}

2 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:13)

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方法完成。

在致电null之前,无需将值设置为RemoveAt