使用{}语句在里面调用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)的控制…
- 我的
scope.Complete()
被调用? - 对于范围的
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/finally
块using
包装它。
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拾取的对象,否则没有问题。