每次用户点击下一张图像时,我都有一个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
}
}
答案 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
。