Не относится ли эта же проблема к Dispose()
?
Вроде, но не полностью. В частности, «тогда его собственная очистка не удастся» возможна, но маловероятна, поскольку Dispose()
должен быть безопасным для вызова несколько раз для одного и того же объекта, и, как правило, не будет проблемой вызывать его несколько раз для разных копий тот же объект.
Если структуры не могут иметь финализаторы, почему им разрешено реализовывать IDisposable
?
Позволение это естественное поведение; это дает языку более простые правила. Поскольку программист, скорее всего, не ошибется случайно, преимущество в написании дополнительного кода в компиляторе, который отклоняет это, невелико.
Йероен Мостерт добавляет, что для структур может иметь смысл даже реализовать IDisposable
:
IDisposable
может быть реализован просто потому, что это требование какого-то другого кода, даже если реализация Dispose()
для этого конкретного типа абсолютно ничего не сделает. В этом случае нет риска случайно вызвать его в другой копии. Примером этого является случай, когда структура реализует IEnumerator<T>
, где IEnumerator<T>
в свою очередь реализует IDisposable
.