C# 内存管理篇---IDisposable接口

推荐使用 System.IDisposable 接口替代析构函数

 

IDisposable接口定义了一种模式,该模式为释放非托管的资源提供了确定的机制,并避免产生析构函数固有的与垃圾回收器相关问题。

IDisposable接口声明了一个 Dispose() 方法, 它不带参数, 返回 void。 

class MyClass : IDisposable
{
    public void Dispose()
    {
        // 做点什么
    }
}

Dispose() 方法为何时释放非托管资源提供了精确的控制。

假定有一个 ResourceGobbler类, 它需要使用某些外部资源,且实现 IDisposable 接口。 如果要实例化这个类的实例,使用它,然后释放它, 可以使用下面的代码:

var theInstance = new ResourceGobbler();

// 做点什么

theInstance.Dispose();

但是,如果在做点什么的时候出现了异常, 就不会执行 Dispose了,也就不会释放 theInstance 使用的资源。所以使用 try块,来编写下面的代码:

ResourceGobbler theInstance = null;

try
{
    theInstance = new ResourceGobbler();
    // 做点什么
}
finally
{
    theInstance?.Dispose();
}


 

重点来了!重点来了!重点来了!

 

使用 try/finally ,即使在处理过程中出现了异常, 也可以确保总是在 theInstance 上调用 Dispose() 方法,总是释放 theInstance使用的任意资源。 但这样的结构总是重复的, 代码就很容易被混淆。 这时候 C# 提供了一种语法,可以确保在实现 IDisposable 接口的对象的引用超出作用域时,在该对象上自动调用 Dispose 方法。 

上代码:

using (var theInstance = new ResourceGobbler())
{
    // 做点什么
}

上面的代码生成与 try块等价的 IL代码。

需要注意的是 using 这个关键字是不是看着很熟悉呢?

记住 using 关键字在完全不同的环境下,它与名称空间没有关系。在这里叫using语句(非托管资源需要回收时,继承了IDisposable接口的类,使用它就对了)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值