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