Повторное освобождение в C#
Dispose могут вызвать и вручную, и из using.
Метод должен оставаться безопасным при повторе.
Обычно хранят флаг disposed или проверяют
поле open. Первый вызов освобождает ресурс,
повторные вызовы сразу выходят. Так вложенный Dispose
не обращается к уже закрытому дескриптору.
Класс SafeRoom защитим от повторного закрытия:
SafeRoom room = new SafeRoom();
room.Dispose();
room.Dispose();
Console.WriteLine(room.open);
class SafeRoom : IDisposable {
private bool disposed = false;
public bool open = true;
public void Dispose() {
if (disposed) {
return;
}
disposed = true;
open = false;
Console.WriteLine("room closed");
}
}
Добавьте флаг в свой класс с явным освобождением и сделайте завершение работы безопасным при повторе: повторный вызов не меняет результат.
Создайте Outer с полем Inner,
оба с защитой от повторного освобождения.
Завершите работу с внешним объектом дважды.