Intereting Posts
ConcurrentDictionary Pitfall – Являются ли delegates фабриками из GetOrAdd и AddOrUpdate синхронизированными? Управление переключателем в Windows Forms Переключиться на последнее активное приложение, например, Alt-Tab Конверсия между Фаренгейтом и objectiveсия ВОПРОС Как проверить подключение к Интернету с .NET, C # и WPF беспокойство о возврате доходности и нарушении от foreach Как убедиться, что controller и действие существуют до выполнения перенаправления, asp.net mvc3 StringFormat и Multibinding с меткой Как сохранить соотношение сторон на масштабируемом, прокручиваемом контенте в WPF? Сетевое соединение C #, запущенное с общего диска OleDb Update sql с параметром, не обновляющим запись в Access Зачем запускать Visual Studio как «Запуск от имени администратора»? RegLoadAppKey отлично работает в 32-разрядной ОС, не работает в 64-разрядной ОС, даже если оба процесса являются 32-разрядными Создание Data.Frame с использованием R.NET Каков самый быстрый способ загрузки XML в XDocument?

использование на SQLDataReader

Я знаю, что раньше задавал родственный вопрос. Я просто подумал.

using (SqlConnection conn = new SqlConnection('blah blah')) { using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) { conn.open(); // *** do I need to put this in using as well? *** SqlDataReader dr = cmd.ExecuteReader() { While(dr.Read()) { //read here } } } } 

Аргумент SqlDataReader : поскольку объект SqlDataReader dr является НОВЫМ ОБЪЕКТОМ, КАК ОБЪЕКТОМ или командами, его просто ссылкой, указывающей на метод cmd.ExecuteReader() , нужно ли использовать читатель внутри using . (Теперь, основываясь на моем предыдущем сообщении, я понимаю, что любой объект, который использует IDisposable должен быть помещен в using , а SQLDataReader наследует от IDisposable , поэтому мне нужно его поместить. Правильно ли я на мой взгляд?) Я просто путают, так как это не новый объект, может ли он вызвать проблемы с удалением объекта, который просто является ссылочным указателем на команду?

Большое спасибо

Я думаю, вы ошибаетесь. dr является ссылкой на объект, возвращаемый cmd.ExecuteReader , который будет новым объектом. В вашем примере ничто не удалит dr , поэтому да, это должно быть в using или вручную.

Ваше мнение о разработчиках IDisposable которые должны быть в using неверно. Они будут функционировать отлично снаружи. using оператор – просто синтаксический сахар для try ... finally . Вещи, реализующие IDisposable должны иметь Dispose , потому что они сигнализируют, что им нужно депонировать определенное состояние.

Обратите внимание: если вы не вызываете Dispose , это не всегда проблема. Некоторые объекты также реализуют финализатор, который будет запускаться сборщиком мусора. Если они не реализуют финализатор, они могут оставить неуправляемую память невосстановленной. Это не будет сохранено до тех пор, пока ваше приложение не закроется. Вся управляемая память в конечном итоге восстанавливается, если только она не является сборной для сбора мусора.

Переписан:

 using (SqlConnection conn = new SqlConnection('blah blah')) using(SqlCommand cmd = new SqlCommand(sqlStatement, conn)) { conn.open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { //read here } } } 

Вы должны обернуть считыватель данных в операторе using, поскольку метод ExecuteReader создает новый экземпляр для чтения данных, который также должен быть удален.