Есть несколько способов взглянуть на это. Один из способов пытается выяснить, действительно ли необходимо избавиться от объекта, как только он больше не нужен, например, с помощью Reflector, чтобы определить, удерживает ли он действительно неуправляемые ресурсы, или они были случайно удалены в любом случае. Другая перспектива состоит в том, чтобы предположить, что если объект реализует IDisposable, не ваша задача определить, действительно ли нужно вызывать Dispose () - вы всегда вызываете его. Я думаю, что это правильный путь. Если заглянуть в частную реализацию объектов и принять решение о том, как их использовать, вы рискуете быть связанным с реализацией, которая может измениться. Примером является LINQ to SQL DataContext. Он реализует IDispose, но в основном очищается после себя без необходимости явного вызова Dispose (). Я предпочитаю писать код, который в любом случае явно удаляется, но другие считают, что в этом нет необходимости.
Конечно, это все относится к объектам, которые реализуют IDisposable. Это правда, что GC позаботится обо всем остальном без каких-либо явных действий с вашей стороны, но стоит немного почитать о тонкостях поведения GC (я слишком устал думать о деталях прямо сейчас), чтобы знать, когда распоряжаться объектами явным образом и, что более важно, когда реализовывать IDispose. На этот счет есть много хороших статей о взаимосвязях.
И, как уже было сказано, использование (..) {...} - ваш друг для разработчиков IDisposable.