使用{}语句在内部调用return是一种好方法吗



我只想知道在using块内调用return是否安全/良好。

例如

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()方法也是如此

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

在上面的示例中,在返回true之后,作用域将被释放并返回值。CCD_ 11和CCD_。然而CCD_ 13将被调用,因为它位于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()提交事务。

这很好-finally子句(这是using子句的右大括号在引擎盖下所做的)总是在作用域离开时执行,无论如何。

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

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

因此,在这个示例中,Complete()没有被调用,作用域被释放,假设它继承了IDisposable接口。

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

关于return本身——是的,在using语句中调用它是安全的。使用翻译来尝试最终在场景后面阻止,并且最终阻止是肯定要执行的。

在您提供的示例中,存在一个问题;scope.Complete()从不被调用。其次,在using语句中使用return语句不是一个好的做法。参考以下内容:

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

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

因此,最好不要使用语句返回内部。

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

相关内容

最新更新