RemoveAt (х); Располагает ли он элемент x? - программирование
Подтвердить что ты не робот

RemoveAt (х); Располагает ли он элемент x?

У меня есть 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
   }
}
4b9b3361

Ответ 1

Коллекции в .NET не "владеют" объектом. Поэтому они не могут предположить, что объект нигде не используется, поэтому они не могут уничтожить объект. Правила владения являются полностью собственными для реализации. Это означает, что вы также должны быть уверены, что изображение не отображается, скажем, в PictureBox.

Обеспечение того, чтобы изображение не занимало какую-либо память, также имеет значение iffy. Вы сами не можете управлять памятью, это задача сборщика мусора. Тем не менее, изображение использует довольно значительное количество неуправляемой памяти для хранения данных пикселей, эта память освобождается при вызове Dispose(). Управляемая часть изображения остается в памяти, пока 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.

Нет необходимости устанавливать значение null перед вызовом RemoveAt.