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