Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csOpRsDg 163 of 163 menu
◀

Повторное освобождение в 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, оба с защитой от повторного освобождения. Завершите работу с внешним объектом дважды.

←
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить