RemoveAt (x);它是否释放了元素x
本文关键字:释放 放了 是否 元素 RemoveAt | 更新日期: 2023-09-27 18:10:31
我有一个缓存来存储最近的两个图像,每次用户单击下一个图像,是否"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
}
}
. net中的集合不"拥有"一个对象。所以他们不能假设这个对象在其他地方没有被使用,因此他们不能处理这个对象。所有权规则完全由您自己实现。这确实意味着你还必须确保图像不是,比如说,显示在一个PictureBox中。
确保图像不再占用任何内存也是不确定的。您不能自己管理内存,这是垃圾收集器的工作。但是,Image使用相当多的非托管内存来存储像素数据,当您调用Dispose()时,这些内存确实会被释放。Image的托管部分留在内存中,直到GC到达它。
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