Должны ли реализации IDisposable.Dispose () быть идемпотентными?

Платформа Microsoft.NET предоставляет интерфейс IDisposable , который требует реализации void Dispose () метод. Его цель состоит в том, чтобы разрешить ручное или основанное на объеме высвобождение дорогостоящих ресурсов, которые могла бы выделить реализация IDisposable . Примеры включают коллекции баз данных, потоки и дескрипторы.

У меня вопрос: должна ли реализация метода Dispose () быть идемпотентной - при вызове более одного раза в одном и том же экземпляре экземпляр должен быть «удален» только один раз, а последующие вызовы не чтобы выбросить исключения. В Java большинство объектов, которые имеют похожее поведение (опять же, потоки и соединения с базой данных приходят мне в голову в качестве примеров), являются идемпотентными для их операции close () , которая является аналогом для Dispose () метод.

Однако мой личный опыт работы с .NET (и в частности с Windows Forms) показывает, что не все реализации (которые являются частью самой платформы .NET ) идемпотентны, поэтому последующие вызовы этих выбросить ObjectDisposedException . Это действительно сбивает меня с толку в отношении того, как следует подходить к реализации одноразового объекта.Есть ли общий ответ для этого сценария или он зависит от конкретного контекста объекта и его использования?

22
задан Ry- 13 November 2017 в 11:26
поделиться