C# 如果using块返回,IDisposable是否会被释放?

C# 如果using块返回,IDisposable是否会被释放?,c#,.net,return,idisposable,using,C#,.net,Return,Idisposable,Using,比如说 using(var something = GetSomething()) { something.DoSomething(); if(something.IsX()) return true; } return false; 是的,绝对是。调用Dispose方法,但是执行using语句,除非它是突然的整个进程终止。最常见的情况是: 块内的返回 在块内引发(但未捕获)异常 自然到达街区的尽头 基本上,using语句对于try/finally块来说主要是语法上的糖分,

比如说

using(var something = GetSomething())
{
    something.DoSomething();
    if(something.IsX()) return true;
}
return false;

是的,绝对是。调用
Dispose
方法,但是执行
using
语句,除非它是突然的整个进程终止。最常见的情况是:

  • 块内的
    返回
  • 在块内引发(但未捕获)异常
  • 自然到达街区的尽头
基本上,
using
语句对于
try
/
finally
块来说主要是语法上的糖分,而
finally
具有所有相同的属性

编辑:摘自本手册第8.13节:

using
语句分为三个部分:获取、使用和处置。资源的使用隐式地包含在包含
finally
子句的
try
语句中。这个
子句最终处置了资源

本规范第8.10节描述了
最后的
声明:

当控件离开
try
语句时,始终执行
finally
块的语句。无论控制权转移是否由于正常执行而发生,都是如此;由于执行了
中断
继续
转到
返回
语句;或者由于从
try
语句传播异常而导致


据我所知,using块将在对象退出作用域后立即处理该对象


例如,当返回true时,下一条语句超出范围,因此变量将被释放。

我认为一旦控件退出
{}
dispose将被调用,因此简而言之
Yes

Yes,使用的是一个编译器特性,它扩展到

try {
  ...
  return ...;
}
finally {
  foo.Dispose();
}

:

using语句确保 即使出现异常,也会调用Dispose 在调用方法时发生 在物体上。你可以实现 通过放置对象得到相同的结果 在try块中,然后调用 在最后一块中处理

:

而catch是用来处理 语句中出现的异常 块,最后用于保证 执行代码的语句块 不管前面的程序如何尝试 块已退出


因此,
使用
转换为
尝试/最终
,在
最终
部分中使用
.Dispose()
,确保无论try/catch中发生什么情况都始终执行它。

还没有提到的一点是,虽然“使用”块中的“return”将调用受控变量上的Dispose,但“使用”中的“收益回报”“迭代器中的块不会处理受控变量,除非与迭代器关联的IEnumerator已被处理。

我知道你是Jon Skeet,但你能引用一个引用吗?:)@路易斯:不可能-所有的文档都引用了乔恩·斯基特。@Florian:我已经用规范中最相关的引用改写了你的编辑。OP可以阅读规范以了解更多详细信息。@Louis:我已经添加了规范中的引用。希望这能起到作用。嗯,这是一个有趣的问题,你在做GetSomething()而不是新的东西。我认为框架没有智能来区分差异。如果某个东西是单例的,那么退出后可能会出现“DisposedObject”异常。您可以使用(GetSomething())构建一个小的测试应用程序,以了解框架对一个。