Я думаю, что вы ошибаетесь. dr
является ссылкой на объект, возвращаемый cmd.ExecuteReader
, который будет новым объектом. В вашем примере, ничто не избавится от dr
, так что да, оно должно быть в using
или вручную.
Ваше суждение о IDisposable
разработчиках , нуждающихся в для включения в using
, неверно. Они будут нормально работать на улице. using
оператор - просто синтаксический сахар для try ... finally
. Вещи, реализующие IDisposable
, должны вызывать Dispose
, потому что они сигнализируют о том, что им нужно избавиться от определенного состояния детерминированным образом.
Обратите внимание, что если вы не позвоните Dispose
, это не всегда проблема. Некоторые объекты также реализуют финализатор, который будет вызываться сборщиком мусора. Если они не реализуют финализатор, они могут оставить неуправляемую память невостребованной. Это останется невостребованным, пока ваше приложение не закроется. Вся управляемая память в конечном итоге восстанавливается, если она не доступна для сборки мусора.
написано Re-:
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
}
}
}