在using语句中创建的对象发生了什么
本文关键字:对象 发生了 什么 创建 using 语句 | 更新日期: 2023-09-27 18:12:03
我一直在努力寻找这个,找不到答案,可能是我没有看正确的地方,所以请容忍我…
问题:
我知道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
}
哪个是最佳实践,哪个更有效?
没有命令对象的dispose方法也会被调用吗?
或者我应该这样做:
是的
哪个是最佳实践,哪个更有效?
最后一个。注意你可以避免在页面上使用"heading right":
using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
// some work
}
我懒得用ADO。直接净;另一个选择是获得一个工具来处理除连接之外的所有事情(示例显示为"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
}
那么你就不需要担心命令,数据阅读器,参数等
是的,你应该使用第二个。你也可以将语句缩写为:
using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
//some work
}
// some work
如果你没有用using
语句包装你的一次性对象,Dispose方法将不会被调用。在您的情况下,只有connection
将被处理。
我知道using语句调用对象的dispose方法,例如:
如果该对象实现了IDisposable
接口。否则,你甚至不能在using
语句中使用对象。
你应该使用using
语句来处理你想要处理的对象。因此,您应该使用自己提供的最后一个示例(包含两个using语句)。