在SQLDataReader上使用

xes*_*shu 11 c# dispose sqldatareader using-statement

我知道我之前提过了一个相关的问题.我只是想到了另一个想法.

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

参数是:由于SqlDataReader dr对象不是一个新的对象,如连接或命令对象,它只是一个指向cmd.ExecuteReader()方法的引用,我是否需要将阅读器放在一个using.(现在基于我以前的帖子,我的理解是任何使用的对象IDisposable需要放入using,并SQLDataReader继承IDisposable,所以我需要把它.我的判断是否正确?)我只是困惑,因为它不是一个新的对象,它会在处理一个只是命令的引用指针的对象时引起任何问题吗?

非常感谢

Ada*_*rth 27

我觉得你错了.它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 
        } 
   } 
} 
Run Code Online (Sandbox Code Playgroud)