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

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

例如。

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

我们知道在最后的大括号dispose()将被closures。 但是,在上述情况下,由于return跳出给定范围(AFAIK)的控制…

  1. 我的scope.Complete()被调用?
  2. 对于范围的dispose()方法也是如此。

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

在上面的例子中,返回true ,范围将被丢弃并返回值。 return false ,并且scope.Complete() 不会被调用。 但是由于它驻留在finally块内部,所以不pipe它是否被调用。

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

 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垃圾。 取决于你的devise。

因此,在本示例中,不调用Complete(),并假定它inheritance了IDisposable接口,并且处理作用域。

scope.Complete在return前一定要调用。 编译器将显示一个警告,这个代码将永远不会被调用。

关于return本身 – 是的,在using说明书中称之为安全。 使用被翻译成try-finally块后面的块,最后块被肯定执行。

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

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

在这个简单的例子中,重点是: 使用语句完成后, scope的值将为空。

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

要确保scope.Complete()将被调用,请使用try/finally包装它。 这个dispose被调用,因为你已经using了替代try/finallyusing包装它。

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

在这个例子中,scope.Complete()永远不会执行。 但是,return命令将清除在堆栈上分配的所有内容。 GC将负责处理所有未提及的事情。 所以,除非有一个不能被GC拾取的对象,否则没有问题。