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)
| 归档时间: |
|
| 查看次数: |
22841 次 |
| 最近记录: |