我在代码库中发现了一个可能的问题,开发人员忘记用curley括号包装using
语句的内容:
using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
try
{
RecordUserConnectionCore(context, userName);
transactionScope.Complete();
}
catch
{
transactionScope.Dispose();
throw;
}
try / catch是否在using语句中执行? transactionScope是否正确处理?
请注意,这个问题与try / catch块在using context中执行有关。我问,因为try / catch代码周围没有大括号。
答案 0 :(得分:2)
重新阅读后,我意识到我错过了实际的问题。
是的,即使try/catch
语句没有括号,using
仍在using
块内。
如果一个块没有大括号,那么该块只包含下一个语句或block 。
所以使用另一个例子,你可以这样做:
if(x = 1)
{
try{}
catch{}
}
或者
if(x=1)
try{}
catch{}
两者完全相同。
为了便于阅读,我通常会添加大括号。我认为它有点清晰,不知道语法细节的人不会混淆。
是的,在您的代码中TransactionScope
总是被处置掉。
将其放入using
块并调用Dispose
,如果出现异常,Dispose
会被调用两次。它会在catch
块中调用一次,并在using
块的末尾再次调用。 (这不会引发异常,但这是不必要的。)
using
块意味着即使出现异常,transactionScope
也已被处置。所以你可以这样做:
using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
{
RecordUserConnectionCore(context, userName);
transactionScope.Complete();
}
答案 1 :(得分:1)
Try / Catch正在使用块内执行。您的代码与您拥有以下代码完全相同:
using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
{
try
{
RecordUserConnectionCore(context, userName);
transactionScope.Complete();
}
catch
{
transactionScope.Dispose();
throw;
}
}
您可以知道这是真的原因之一是因为
transactionScope.Dispose();
行编译。