Многие объекты манипулируют другими объектами так, что если их не очистить, это вызовет проблемы. Эти другие объекты могут быть почти чем угодно, и они могут быть почти где угодно. Например, объект Socket может попросить другую машину открыть TCP-соединение. Эта другая машина может быть не в состоянии обрабатывать очень много соединений одновременно; действительно, это может быть устройство, оснащенное Интернетом, которое может обрабатывать только одно соединение за раз. Если бы программа открыла сокет и просто забыла об этом, никакой другой компьютер не смог бы подключиться к устройству, если только или до тех пор, пока сокет не будет закрыт (возможно, устройство может закрыть сам сокет после нескольких минут бездействия, но это будет бесполезен до тех пор).
Если объект реализует IDisposable, это означает, что он обладает знаниями и стимулом, необходимыми для выполнения необходимых действий по очистке, и такие действия необходимо выполнить до того, как такие знания и импульс будут потеряны. Вызов IDisposable.Dispose обеспечит выполнение всех таких действий по очистке, после чего объект можно будет безопасно покинуть.
Microsoft разрешает объектам запрашивать защиту от отказа, регистрируя метод Finalize. Если объект делает это, метод Finalize будет вызван, если система обнаружит, что объект был оставлен. Ни объект, ни любые объекты, на которые он имеет прямые или косвенные ссылки, не будут удалены из памяти до тех пор, пока метод Finalize не получит возможность запуска. Это обеспечивает что-то вроде «обратного останова» в случае, если объект был оставлен без предварительной утилизации. Однако существует множество ловушек с объектами, которые реализуют Finalize, поскольку нет никакой гарантии относительно того, когда он будет вызван. Мало того, что объект может быть заброшен задолго до вызова Finalize, но и если вы не будете осторожны, система может вызвать Finalize объекта, пока его часть еще используется. Опасные вещи. Гораздо лучше правильно утилизировать.