博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现IDispose接口
阅读量:4311 次
发布时间:2019-06-06

本文共 1274 字,大约阅读时间需要 4 分钟。

文章转载自http://www.cnblogs.com/tearer/p/3208340.html

 

.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源。其次,GC也不是实时的,所有GC存在不确定性。

为了解决这个问题donet提供了析构函数

public class TestClass : System.IDisposable{    //供程序员显式调用的Dispose方法    public void Dispose()    {        //调用带参数的Dispose方法,释放托管和非托管资源        Dispose(true);        //手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数        System.GC.SuppressFinalize(this);    }    //protected的Dispose方法,保证不会被外部调用。    //传入bool值disposing以确定是否释放托管资源    protected void Dispose(bool disposing)    {        if (disposing)        {            ///TODO:在这里加入清理"托管资源"的代码,应该是xxx.Dispose();        }        ///TODO:在这里加入清理"非托管资源"的代码    }    //供GC调用的析构函数    ~TestClass()    {        Dispose(false);//释放非托管资源    }}

 

而即使我们忘记了在合适的时候调用Dispose,GC也会在释放对象的时候帮我们清理非托管资源的。GC所充当的角色只是一种保障手段,它应该充当这种角色,我们不能过分依赖它。实际上,在较大的模块退出时我们还应该及时地手动调用GC.Collect进行垃圾回收。

为什么实现IDisposable接口的类的对象,因为.net CLR是采用GC(垃圾回收器)机制管理内存,不想C++语言那样,能保证对象的析构函数在作用域结束时被总是被自动调用,有时如果程序运行的过程中一直没有满足启动GC的条件,则可能GC一次也没启动。 这样,如果一个类需要占用重要资源,就应该实现IDisposable接口,或者使用另一种简捷的方式:使用Using,如:

Using(MyClass myObj = new MyClass())

{ ... }

对于没有实现IDisposable接口的,也就没什么Dispose方法,但他们的Finalize同样不能保证被调用。

Using(MyClass myObj = new MyClass())

{ ... }

是一种好方法,但是只有MyClass实现了IDisposable接口才能这样写.

转载于:https://www.cnblogs.com/chenjinshi/p/4535179.html

你可能感兴趣的文章
js 给一段代码,给出运行后的最终结果的一些综合情况、
查看>>
webservice 详解
查看>>
js自动补全实例
查看>>
VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“
查看>>
npm 安装 sass=-=-=
查看>>
WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新
查看>>
C#类对象的事件定义
查看>>
各类程序员学习路线图
查看>>
HDU 5510 Bazinga KMP
查看>>
关于select @@IDENTITY的初识
查看>>
ASP.NET MVC ajax提交 防止CSRF攻击
查看>>
关于CSS伪类选择器
查看>>
适用于带文字 和图片的垂直居中方法
查看>>
Part 2 - Fundamentals(4-10)
查看>>
使用Postmark测试后端存储性能
查看>>
NSTextView 文字链接的定制化
查看>>
第五天站立会议内容
查看>>
CentOs7安装rabbitmq
查看>>
(转))iOS App上架AppStore 会遇到的坑
查看>>
解决vmware与主机无法连通的问题
查看>>