如果使用块返回,是否会丢弃IDisposable?

Lou*_*hys 6 .net c# idisposable using return

例如

using(var something = GetSomething())
{
    something.DoSomething();
    if(something.IsX()) return true;
}
return false;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

是的,一点没错.Dispose然而,该方法被调用using,除非是一个突然的全过程终止,否则执行该语句.最常见的情况是:

  • return块内
  • 块内抛出(并未捕获)异常
  • 自然地到达块的尽头

基本上,using语句主要是try/ finallyblock的语法糖- 并且finally具有所有相同的属性.

编辑:从C#4规范的第8.13节:

一个using语句stranslated分为三个部分:获取,使用和处置.资源的使用隐式包含在try包含finally子句的语句中.该finally子句处理资源.

finally声明是在规范的第8.10描述:

一的语句finally在控制离开块总是被执行try的语句.无论控制转移是否是正常执行的结果,都是如此; 作为执行的结果break,continue,gotoreturn语句; 或者将异常传播出try声明.

  • @Louis:不可能 - 所有文档都引用了Jon Skeet. (5认同)