Ваш вопрос о том, стоит ли вам всегда звонить Dispose
, обычно является жарким спором. См. этот блог для интересной перспективы от уважаемых людей в сообществе .NET.
Лично я думаю, что позиция Джеффри Рихтера о том, что колл Dispose
не является обязательным, невероятно слаба. Он приводит два примера, чтобы оправдать свое мнение.
В первом примере он говорит, что вызов Dispose
в элементах управления Windows Forms утомителен и не нужен в основных сценариях. Однако он не упоминает, что Dispose
фактически вызывается автоматически контейнерами управления в этих основных сценариях.
Во втором примере он заявляет, что разработчик может ошибочно предположить, что экземпляр из IAsyncResult.WaitHandle
должен быть агрессивно удален, не понимая, что свойство лениво инициализирует дескриптор ожидания, что приводит к ненужному снижению производительности. Но проблема этого примера в том, что сам IAsyncResult
не придерживается собственных опубликованных руководящих принципов Microsoft по работе с объектами IDisposable
. То есть, если класс содержит ссылку на тип IDisposable
, тогда сам класс должен реализовать IDisposable
. Если IAsyncResult
следует этому правилу, тогда его собственный метод Dispose
может принять решение о том, кого из его составляющих необходимо удалить.
Так что, если у кого-то нет более веских аргументов, я собираюсь остаться в лагере «Всегда вызывай распоряжаться» с пониманием того, что будут некоторые дополнительные случаи, которые возникают в основном из-за неудачного выбора дизайна.