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