I think you are mistaken. The dr
is a reference to the object returned by cmd.ExecuteReader
, which is going to be a new object. In your example, nothing will dispose dr
, so yes it needs to be in a using
, or manually disposed.
Your judgement about IDisposable
implementors needing to be in a using
is not correct. They will function fine outside. A using
statement is just syntactic sugar for a try ... finally
. Things implementing IDisposable
should have Dispose
called, because they are signalling that they need to dispose certain state in a deterministic way.
Note that if you do not call Dispose
, its not always a problem. Some objects also implement the finalizer, which will be triggered by the garbage collector. If they do not implement the finalizer, they might leave unmanaged memory unreclaimed. This will remain unreclaimed until your application closes. All managed memory is eventually reclaimed, unless it is not elligible for garbage collection.
Re-written:
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
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…