c#内存回收

来源:互联网 发布:mariadb与mysql 编辑:程序博客网 时间:2024/04/30 01:47

托管资源 :值类型 引用类型

非托管资源eg 文件流 数据库连接 socket

值类型存在堆栈中

引用类型(string Array delegate)实例存在托管堆中,托管堆由垃圾收集器GC自动回收

封装了非托管资源的类型需要在回收内存前释放非托管资源

1.       终结器Finalize(C#中对应析构函数,实际上是clr根据析构函数再生成finalize函数),由GC自动调用;

实现:

{

Dispose(false);

}

2.       Dispose() 需在程序中显式调用

实现:

{

  Dispose(true);

  GC.SuppressFinalize(this); 手动释放后,指明无需GC调用Finalize()再次释放

}

3.       Close()

  在语义上它和Dispose很类似,按照MSDN的说法,提供这个函数是为了让用户感觉舒服一点,因为对于某些对象,例如文件,用户更加习惯调用Close()

 

其中Dispose(bool) 参数为true时,回收托管资源和非托管资源

                 参数为false时,只回收非托管资源

 

 

 

Using 语句

定义一个范围,将在此范围之外释放一个或多个对象。末尾调用Dispose方法释放资源

using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。