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将被调用,因此简而言之YesYes,使用的是一个编译器特性,它扩展到
try {
...
return ...;
}
finally {
foo.Dispose();
}
对
:
using语句确保
即使出现异常,也会调用Dispose
在调用方法时发生
在物体上。你可以实现
通过放置对象得到相同的结果
在try块中,然后调用
在最后一块中处理
:
而catch是用来处理
语句中出现的异常
块,最后用于保证
执行代码的语句块
不管前面的程序如何尝试
块已退出
因此,使用
转换为尝试/最终
,在最终
部分中使用.Dispose()
,确保无论try/catch中发生什么情况都始终执行它。还没有提到的一点是,虽然“使用”块中的“return”将调用受控变量上的Dispose,但“使用”中的“收益回报”“迭代器中的块不会处理受控变量,除非与迭代器关联的IEnumerator已被处理。我知道你是Jon Skeet,但你能引用一个引用吗?:)@路易斯:不可能-所有的文档都引用了乔恩·斯基特。@Florian:我已经用规范中最相关的引用改写了你的编辑。OP可以阅读规范以了解更多详细信息。@Louis:我已经添加了规范中的引用。希望这能起到作用。嗯,这是一个有趣的问题,你在做GetSomething()而不是新的东西。我认为框架没有智能来区分差异。如果某个东西是单例的,那么退出后可能会出现“DisposedObject”异常。您可以使用(GetSomething())构建一个小的测试应用程序,以了解框架对一个。