Память и внешние ресурсы в C#
Объект в куче может занимать мало памяти, но держать тяжелый ресурс операционной системы.
Открытый файл, сетевое соединение или блок неуправляемой памяти живут отдельно от байтов самого объекта. Сборщик со временем уничтожит объект-обертку, но момент закрытия файла может запаздывать относительно того момента, когда программа уже закончила с ним работу. Поэтому такие ресурсы завершают явно - отдельной командой в коде, когда участок работы с ресурсом закончился.
Класс-заглушка покажет идею: объект «открывает» ресурс и должен его «закрыть»:
LogSession session = new LogSession();
Console.WriteLine(session.open);
session.Close();
class LogSession {
public bool open = true;
public void Close() {
open = false;
Console.WriteLine("closed");
}
}
Пока open равен true, ресурс считается
занятым. После Close программа явно
фиксирует, что ресурс больше не используется.