C# 使用Using和Try/Finally 进行资源清理

.NET 环境规定由使用类创建实例对象的代码来处理对象的资源回收操作,也就是由调用对象的代码来调用Dispose()(实现IDisposable接口)方法来处理资源回收。

 

所有拥有托管资源的类型都实现了IDisposable接口,并且都创建了一个finalizer来防止你没有显示地调用dispose,但若依赖于此,在执行此类finalizer释放资源操作时,由于贮存在内存中的资源过多,执行释放操作会使程序变得很慢。

 

好在C#提供了using 关键字来帮助你确保时候后释放资源,其在编译时会生成和try/finally同样的的IL代码。其会在释放资源时通知GC去释放资源,其内部调用的方法为:GC.SuppressFinalize()。使用方法和try/finally对比代码如下:

 

SqlConnectionmyConnection = null;

// Example Usingclause:

using (myConnection =new SqlConnection(connString))

{

myConnection.Open();

}

// example Try /Catch block:

try

{

myConnection= new SqlConnection(connString);

myConnection.Open();

}

finally

{

myConnection.Dispose();

}

 

注意:using 只能用于实现了IDisposable接口的方法的类型,否则编译时就会报错了

 

若你不知道你要是用的对象是否支持IDisposable接口,那么你可以使用 as语法,假定其可以被using代码如下:

 

// The correct fix.

// Object may or maynot support IDisposable.

object obj =Factory.CreateResource();

using (obj asIDisposable)

Console.WriteLine(obj.ToString());

 

注意:若有多个嵌套的支持IDisposable接口对象的资源使用情况,请使用try/finally,以免生成过多的try/finally嵌套 IL代码。

 

最后,记住一点,不要在对象还被其他对象引用时就调用其Dispose方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值