C#中using语句是否会释放代码块内实例化的对象?
关于using语句对象销毁的疑问解答
示例代码
using(var context = new FirstAppDemoDbContext()) { SQLEmployeeData sqlData = new SQLEmployeeData(context); model.Employees = sqlData.GetAll(); }
问题解答
using块只会自动处理在using声明中创建的实现IDisposable接口的对象(也就是示例里的context),不会销毁代码块内定义的其他对象,具体说明如下:
- using语句的核心作用是确保实现
IDisposable的对象在代码块结束时自动调用Dispose()方法,释放其占用的非托管资源。这和“销毁对象”不是同一概念——对象内存的回收是.NET垃圾回收器(GC)的工作,GC会在对象没有任何引用时自动清理内存。 - 示例中的
sqlData,如果它没有实现IDisposable接口,using块不会对它做任何特殊处理;就算它实现了该接口,只要没被写在using的声明部分,using块也不会自动调用它的Dispose()方法。 - 总结来说,using块的作用范围严格限定在其声明时指定的
IDisposable对象,代码块内其他对象的生命周期完全由.NET垃圾回收机制管理,和using块本身无关。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

