Я не согласен с тем, что вы не должны ничего делать, если вам больше не нужны объекты в списке. Если объекты реализуют интерфейс System.IDisposable
, то разработчик объекта считал, что объект содержит ограниченные ресурсы.
Если вам больше не нужен объект и вы просто присваиваете объекту значение null, то эти ограниченные ресурсы не освобождаются, пока сборщик мусора не завершит работу с объектом. В то же время вы не можете использовать этот ресурс для чего-то другого.
Пример:
Предположим, вы создали растровое изображение из файла и решили, что вам больше не нужны ни растровое изображение, ни файл. Код может выглядеть следующим образом:
using System.Drawing;
Bitmap bmp = new Bitmap(fileName);
... // do something with bmp until not needed anymore
bmp = null;
File.Delete(fileName); // EXCEPTION, filename is still accessed by bmp.
Хороший метод будет:
bmp.Dispose();
bmp = null;
File.Delete(fileName);
То же самое относится к объектам в списке или любой коллекции. Все объекты в коллекции, которые IDisposable должны быть удалены. Код должен быть таким:
private void EmptySequence (IEnumerable sequence)
{ // throws away all elements in the sequence, if needed disposes them
foreach (object o in sequence)
{
System.IDisposable disposableObject = o as System.IDisposable;
o = null;
if (disposableObject != null)
{
disposableObject.Dispose();
}
}
}
Или, если вы хотите создать функцию расширения IEnumerable
public static void DisposeSequence<T>(this IEnumerable<T> source)
{
foreach (IDisposable disposableObject in source.OfType(System.IDisposable))
{
disposableObject.Dispose();
};
}
Все списки / словари / списки / коллекции только для чтения могут использовать эти методы, поскольку все они реализуют интерфейс IEnumerable. Вы даже можете использовать его, если не все элементы в последовательности реализуют System.IDisposable.