Многие старые источники рекомендаций на этот счет подразумевают, что IDisposable каким-то образом связан с финализаторами. Обратите очень пристальное внимание на комментарии Херба Саттера на эту тему. НЕ спешите с выводом, что вам нужно написать финализатор, если вы реализуете IDisposable, чтобы «убедиться, что Dispose в конечном итоге запустится в случае, если клиент забудет его вызвать». Это вообще не тот случай. Класс может реализовывать IDisposable, чтобы он мог выполнять различные вызовы управляемых объектов, которыми он владеет, например, Утилизируйте эти объекты по очереди. Это абсолютно бессмысленно делать с финализатором, потому что финализаторы не могут надежно обращаться к другим управляемым объектам. Кроме того, все, что делает финализатор, должно вызываться из любого потока. Финализаторы - очень непонятная вещь, в то время как IDisposable - это простой шаблон, который должен быть вездесущим. А появление SafeHandle еще более меняет ситуацию .