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