使用{}语句调用return是一个好方法吗?

时间:2012-08-02 11:59:57

标签: c# return using

我只想知道在return区块内调用using是安全/好的方法。

对于前。

using(var scope = new TransactionScope())
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}

我们知道最后一个大括号dispose()会被取消。但是在上面的例子中会有什么,因为return会将控件跳出给定的范围(AFAIK)...

  1. 我的scope.Complete()被叫了吗?
  2. 适用于范围的dispose()方法。

7 个答案:

答案 0 :(得分:118)

return块中调用using是完全安全的,因为使用块只是try/finally块。

在上面的示例中,返回true后,范围将被处理并返回值。 return falsescope.Complete()被调用。然而,Dispose将被调用,因为它位于finally块内。

您的代码与此基本相同(如果这样可以更容易理解):

var scope = new TransactionScope())
try
{
  // my core logic
  return true; // if condition met else
  return false;
  scope.Complete();
}
finally
{
  if( scope != null) 
    ((IDisposable)scope).Dispose();
}

请注意,您的交易将从不提交,因为无法前往scope.Complete()提交交易。

答案 1 :(得分:6)

那很好 - finally子句(这是using子句的结束大括号的内容)总是在保留范围时执行,无论如何。

但是,这仅适用于finally块中的语句(使用using时无法显式设置)。因此,在您的示例中,scope.Complete()永远不会被调用(我希望编译器警告您有关无法访问的代码)。

答案 2 :(得分:2)

总的来说,这是一个很好的方法。但在你的情况下,如果你在调用scope.Complete()之前返回,它只会废弃TransactionScope。取决于您的设计。

因此,在此示例中,未调用Complete(),并且假设它继承了IDisposable接口,则处理作用域。

答案 3 :(得分:2)

scope.Complete绝对应该在return之前调用。编译器将显示警告,并且永远不会调用此代码。

关于return本身 - 是的,在using语句中调用它是安全的。使用被转换为在场景后面的try-finally块,最后块肯定会被执行。

答案 4 :(得分:1)

要确保调用scope.Complete(),请用try/finally换行。调用dispose是因为您将using包裹在另一个try/finally块中。

using(var scope = new TransactionScope())
{
  try
  {
  // my core logic
  return true; // if condition met else
  return false;
  }
  finally
  {
   scope.Complete();
  }
}

答案 5 :(得分:1)

在您提供的示例中,存在问题;永远不会调用scope.Complete()。 其次,在return语句中使用using语句不是一个好习惯。请参阅以下内容:

using(var scope = new TransactionScope())
{
    //have some logic here
    return scope;      
}

在这个简单的例子中,重点是;当使用语句结束时,scope的值将为null。

所以最好不要使用语句返回内部。

答案 6 :(得分:0)

在此示例中,scope.Complete()将永远不会执行。但是,return命令将清除堆栈上分配的所有内容。 GC将处理未引用的所有内容。因此,除非有一个无法通过GC拾取的对象,否则没有问题。