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
}
}
Ответы
Ответ 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
.