Microsoft.NET Framework предоставляет интерфейс IDisposable
, который требует реализации метода void Dispose()
.Его цель - разрешить ручное или объемное освобождение дорогих ресурсов, которые могла бы выделить реализация IDisposable
.Примеры включают базы данных, потоки и дескрипторы.
Мой вопрос заключается в том, должна ли реализация метода Dispose()
быть идемпотентной - при вызове более одного раза в одном и том же экземпляре экземпляр должен быть «удален» только один раз, а последующие вызовы не вызывают исключений,В Java большинство объектов, имеющих сходное поведение (опять-таки, в качестве примера, мне приходят в голову потоки и соединения с базой данных), являются идемпотентными для их операции close()
, которая является аналогом для метода Dispose()
.
Однако мой личный опыт работы с .NET (и, в частности, Windows Forms) показывает, что не все реализации (которые являются частью самой платформы .NET ) являются идемпотентными, поэтому последующиевызовы этих бросают ObjectDisposedException
.Это действительно смущает меня тем, как следует подходить к реализации одноразового объекта.Есть ли общий ответ для сценария или он зависит от конкретного контекста объекта и его использования?