以下代码没有任何类型的错误处理。
我很好奇。就位而言,抛出异常时是否会关闭using语句中创建的连接?或者连接是否会保持打开状态,因为它从未明确关闭?
public override string ResetToDefault() {
string result;
using (var cn = HostFacade.GetDbConnection())
{
cn.Open();
DbProvider.Transaction = cn.BeginTransaction();
// Do something here that throws an unhandled exception.
DbProvider.Transaction.Commit();
cn.Close();
}
return result;
}
编辑:HostFacade.GetDbConnection返回的连接是IDbConnection。这里假设它被实现为SqlConnection对象是安全的。
答案 0 :(得分:1)
是的,因为编译器将using
语句扩展为try...finally
块。您的代码与此相同:
SqlConnection cn = null;
try {
cn = HostFacade.GetDbConnection();
cn.Open();
// .. rest of the code here
}
finally {
if (cn != null)
cn.Dispose();
}
Dispose
来电将关闭连接。
CLR保证finally块将执行..除非在非常特定的情况下(例如调用FailFast
IIRC)。
答案 1 :(得分:0)
这取决于您正在运行的特定库的作者对Dispose()
的实现。
.NET Framework中内置的库(就像你的例子一样)无疑会清理所访问的资源,比如SqlConnection
,但你应该在做任何事情之前首先验证文档。