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