Здесь много хороших ответов, но я также хотел бы отметить, что причина, по которой люди думали, что вам нужен IDisposable, заключается в том, что GC действительно должен называться MemoryCollector или даже ManagedMemoryCollector. GC не особенно умен, когда дело доходит до сбора неуправляемых ресурсов памяти, таких как файлы, контуры БД, транзакции, дескрипторы окон и т. Д.
Одна из причин заключается в том, что управляемый объект может иметь неуправляемый ресурс, который занимает несколько гигабайт оперативной памяти, но для GC он выглядит как 8 байтов или около того.
С файлами, conb db и т. Д. Вы часто хотите закрыть их как можно скорее, чтобы освободить неуправляемые ресурсы и избежать проблем с блокировкой.
С дескрипторами окон мы можем беспокоиться о нитях. Поскольку GC запускается в выделенном потоке, этот поток всегда является неправильным потоком для освобождения дескрипторов окон.
Таким образом, GC помогает избежать утечки управляемой памяти и уменьшить беспорядок в коде, но все же следует освобождать неуправляемые ресурсы как можно скорее.
Использование оператора () является благословением.
PS. Довольно часто я реализую IDisposable, даже если у меня нет прямых неуправляемых ресурсов, однако его importnt, чтобы сообщить всем переменным-членам, которые реализуют IDisposable и Dispose, был вызван.