Ответ 1
Я думаю, вы ошибаетесь. 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
}
}
}