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

80 c# using return

我只是想知道returnusing块内调用它是安全/好的方法.

对于前者

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

我们知道最后一个大括号 dispose()将被取消.但是在上面的情况下,由于return将控件跳出给定范围(AFAIK)......

  1. scope.Complete()被叫了吗?
  2. 对于示波器的dispose()方法也是如此.

Øyv*_*hen 123

returnusing块内调用是完全安全的,因为使用块只是一个try/finally块.

在上面的示例中,返回后true,范围将被处理并返回值.return false,并且scope.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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的交易永远不会提交,因为没有办法scope.Complete()提交交易.

  • 你应该明确表示`Dispose`**将被调用.如果OP不知道`using`会发生什么,很可能他不知道`finally`会发生什么. (11认同)

Luc*_*ero 6

这很好 - finally子句(这是该using子句的结束大括号所做的)总是在保留范围时执行,无论如何.

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