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
   }
}

RemoveAt (x);它是否释放了元素x

. 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