我发现了以下代码段:
using (IDbCommand selectCommand = this.createCommand(selectSQL))
using (IDataReader theData = selectCommand.ExecuteReader())
{
while (theData.Read())
{
Phone aPhone = new Phone(...some code here...);
thePhones.Add(aPhone);
}
}
现在我试图通过将上面的代码解释为旧using
语句来学习此上下文中的try/finally
语句。根据我的理解,using
语句会将括号后的代码解释为try
。在这种情况下,try
应该包含(IDbCommand selectCommand = this.createCommand(selectSQL))
之后的所有内容。但是,在此代码中,第一个using
之后会立即出现另一个using
语句。
在此上下文中将它们解释为嵌套 try/finally
语句是否正确?
答案 0 :(得分:3)
使用语句将自动为其声明中的任何IDisposable对象调用Dispose()。重要的是要注意,这不是您自己的代码可能需要执行的任何try / catch / finally语句的替代。 using语句确保在它的块中的任何代码抛出或不抛出时将调用Dispose()。这在使用I / O对象时非常重要,例如网络调用,流读取,数据库调用等。这将确保您没有内存泄漏或锁定文件。
using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
//an exception or not will call Dispose() on selectCommand
using (IDataReader theData = selectCommand.ExecuteReader())
{
//an exception or not will call Dispose() on theData
while (theData.Read())
{
Phone aPhone = new Phone(...some code here...);
thePhones.Add(aPhone);
}
}
}
在不使用语句的情况下运行此代码的“等效”将是:
var selectCommand = this.createCommand(selectSQL);
try
{
var theData = selectCommand.ExecuteReader();
try
{
while (theData.Read())
{
Phone aPhone = new Phone(...some code here...);
thePhones.Add(aPhone);
}
}
finally
{
if (theData != null)
{
theData.Dispose();
}
}
}
finally
{
if (selectCommand != null)
{
selectCommand.Dispose();
}
}
但是,不应使用上面的代码,因为using语句经过精炼,优化,保证等,但它的要点就在上面。
答案 1 :(得分:0)
using (IDbCommand selectCommand = this.createCommand(selectSQL))
using (IDataReader theData = selectCommand.ExecuteReader())
{
}
在编译时将转换为
using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
using (IDataReader theData = selectCommand.ExecuteReader())
{
}
}
就是这样。它与尝试捕获任何东西无关
答案 2 :(得分:0)
是的,您的代码被解释为
using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
using (IDataReader theData = selectCommand.ExecuteReader())
{
while (theData.Read())
{
Phone aPhone = new Phone(...some code here...);
thePhones.Add(aPhone);
}
}
}
可以被认为是“嵌套的try / finally块”
使用多个using
语句就像使用多个if
语句一样,你可以做到
if(foo)
if(bar)
{
DoStuff()
}
与
相同if(foo)
{
if(bar)
{
DoStuff()
}
}