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