我一直试图搜索这个并找不到答案,可能是我没有找到合适的地方所以请耐心等待...
问题:
我知道using
语句调用对象的dispose方法,例如:
using (SqlConnection conn = new SqlConnection(conString))
{
// some work
}
// dispose method for this connection object will be called must.
但是在using
语句中创建的对象会发生什么?
using (SqlConnection conn = new SqlConnection(conString))
{
SqlCommand cmd = new SqlCommand(query, conn);
// some work
}
是否还会调用命令对象的dispose方法?或者我应该这样做:
using (SqlConnection conn = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand(query, conn))
{
//some work
}
// some work
}
哪种方法最佳,哪种方式更有效?
答案 0 :(得分:4)
是否也会调用命令对象的dispose方法?
没有
或者我应该这样做:
是
哪种方法最佳,哪种方式更有效?
有效的 - 最后一个。请注意,您可以避免"向右前进"在页面上:
using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
// some work
}
我懒得直接使用ADO.NET;另一个选择是获得一个工具来处理除连接之外的所有事情(示例显示为" dapper",但存在其他工具):
using (SqlConnection conn = new SqlConnection(conString))
{
var data = conn.Query<SomeType>(someSql, new { foo, bar }).ToList();
// where @foo and @bar are parameters in the sql
}
那么您不必担心命令,数据读取器,参数等。
答案 1 :(得分:2)
是的,你应该使用第二个。您也可以将该陈述缩短为:
using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
//some work
}
// some work
如果您没有用using
语句包装您的一次性对象,则不会调用Dispose方法。在您的情况下,只会处理connection
。
答案 2 :(得分:1)
我知道using语句调用对象的dispose方法,例如:
如果该对象实现了IDisposable
接口。否则,您甚至无法在using
语句中使用对象。
在执行某些操作后,您应该为要处理的每个对象使用using
语句。所以你应该使用自己提供的最后一个例子(使用两个using语句)。