如果使用块返回,是否会丢弃IDisposable?
例如
using(var something = GetSomething()) { something.DoSomething(); if(something.IsX()) return true; } return false;
是的,一点没错。 调用Dispose
方法然后执行using
语句,除非它是一个突然的全进程终止。 最常见的情况是:
- 块内
return
- 块内抛出(并未捕获)exception
- 自然地到达块的尽头
基本上, using
语句主要是try
/ finally
块的语法糖 – finally
具有所有相同的属性。
编辑:从C#4规范的第8.13节:
using
声明分为三个部分:获取,使用和处置。 资源的使用隐式包含在包含finally
子句的try
语句中。 这个finally
子句处理资源。
finally
语句在规范的8.10节中描述:
当控制离开
try
语句时,总是执行finally
块的语句。 无论控制转移是否正常执行,都是如此; 执行break
,continue
,goto
或return
语句的结果; 或者是从try
语句中传播exception的结果。
是。
using
是一个try / finally块的语法糖 :
using语句确保即使在对象上调用方法时发生exception,也会调用Dispose。 您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;
在finally
块的文档中 :
catch用于处理语句块中发生的exception,而最终用于保证语句代码块的执行,而不管前面的try块是如何退出的。
因此, using
转换为try/finally
,在finally
部分使用.Dispose()
,确保无论try / catch中发生什么,它总是被执行。
是的,using是一个编译器function,可以扩展为
try { ... return ...; } finally { foo.Dispose(); }
据我所知,使用块一旦退出范围就会处理掉它。
例如,当返回true时,下一个语句超出范围,因此将处理该变量。
我认为一旦控制将失去{}
dispose将被调用,所以简而言之Yes
尚未提到的一点是,虽然“using”块中的“return”将在受控变量上调用Dispose,但迭代器中“using”块内的“yield return”将不会处理受控变量,除非IEnumerator与迭代器关联的是Disposed。
- 向Linq 2 Sql查询动态添加未确定数量的子句的正确方法是什么?
- 为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?
- 属性方法?
- 使用ContinueWith作为“最终”操作是否安全?
- .NET Windows窗体DataGridView以编程方式添加时,单元格文本消失
- 如何在multithreading应用程序中安全地填充数据和Refresh()DataGridView?
- 如何在C#.Net中打开或启动PDF文件?
- 为什么((IList )数组).ReadOnly = True但是((IList)数组).ReadOnly = False?
- 如何以编程方式确定是在多核,超线程还是多处理器上?