在using块中接收方法返回的可释放对象会影响自动释放能力吗?
问题解答
你提到的两种写法分别如下:
原写法:
using(var someDisposable = new SomeDisposable(1)) { }
想调整的写法:
using (var someDisposable = Get(1)) { } public SomeDisposable Get(int x) { return new SomeDisposable(x); }
结论
你完全可以放心调整为第二种写法,不会对using块的自动释放能力产生任何影响。
原理说明
using语句是C#针对实现了IDisposable接口的对象设计的语法糖,它的核心逻辑只关心最终拿到的实例本身,和实例的来源没有任何关联:不管是直接在using括号里new出来的实例,还是通过方法返回、属性取值等其他方式拿到的实例,释放逻辑完全一致。
两种写法的执行流程完全相同:
- 先执行using括号内的表达式,获取
SomeDisposable类的实例 - 进入using块执行内部代码
- 无论块内代码正常执行结束,还是中途抛出异常,都会自动调用该实例的
Dispose()方法完成资源释放
注意事项
只要你的Get方法没有把返回的SomeDisposable实例额外存储到其他长期存活的对象中持有,两种写法的资源释放逻辑100%一致,不存在任何差异。
内容的提问来源于stack exchange,提问作者akshit
相关产品推荐
相关产品推荐

