Finalize和Dispose与析构的区别

简介: 在CLR中内存管理的真正工作是由IDisposable接口的Dispose()方法和类的析构函数完成的。
在CLR中内存管理的真正工作是由IDisposable接口的Dispose()方法和类的析构函数完成的。当有非托管资源需要释放的时候,通常应该执行Finalize()方法来代替析构函数。
IDisposable是一个接口,它并不局限在C#中,它是Microsoft的COM技术的一部分,它提供的一个用于清理不仅仅是C#内的各种类型的组件的通用机制.类似与IDisposable的接口使得C#适用于.NET框架。IDisposable定义了一个专门的方法,Dispose().

在类中如果有必须被释放的资源,最好的解决方案就是同时使用析构函数和Dispose()方法。
首先看一下CLR中自动回收的效果:

using System;
using System.Text;

class DR{
     int ci;
     public DR(int i){
        this.ci=i;
        Console.WriteLine("DR({0})",this.ci);
     }
}

class DA : IDisposable{
     int n;
     public DA(int n){
        this.n=n;
        DR MyR=new DR(n);  
     } 

     public void Dispose(){
        Console.WriteLine("Dispose({0})",this.n);
        GC.SuppressFinalize(this);
     }

     ~DA(){
        Console.WriteLine("~DA({0})",this.n);
     }
}


class Demo{ 
     public static void Main(string[] args){    
        DA d1=new DA(1);
        DA d2=new DA(2);
        DA d3=new DA(3);    
}

可以看出CLR里内存管理系统自动按变量进栈的顺序来消除变量。

 

如果我改一下:

using System;
using System.Text;


class DR{
     int ci;
     public DR(int i){
        this.ci=i;
        Console.WriteLine("DR({0})",this.ci);
     }
}

class DA : IDisposable{
     int n;
     public DA(int n){
        this.n=n;
        DR MyR=new DR(n);  
     } 

     public void Dispose(){
        Console.WriteLine("Dispose({0})",this.n);
        GC.SuppressFinalize(this);
     }

     ~DA(){
        Console.WriteLine("~DA({0})",this.n);
     }
}


class Demo{ 
     public static void Main(string[] args){    
        DA d1=new DA(1);
        DA d2=new DA(2);
        DA d3=new DA(3);    
       
        d1=null;
        using(d3){
          DA d4=new DA(4);
        }
        d2.Dispose();
}

 

 

现在可以看出using块中的d3是自动释放的,而且也是最先被释放的,所以在在写程序的时候,多用using块是有好处的,呵呵

 

目录
相关文章
|
6月前
|
编译器 程序员 C++
21 C++ - 对象的构造和析构
21 C++ - 对象的构造和析构
51 0
|
6月前
|
存储 Cloud Native Linux
C++ 继承下的构造函数和析构函数执行顺序
C++ 继承下的构造函数和析构函数执行顺序
|
2月前
|
C++
3. C++构造和析构
3. C++构造和析构
31 0
|
9月前
|
算法 C语言 C++
C++构造和析构
C++构造和析构
|
6月前
|
编译器 C++
23 C++ - 多个对象构造和析构
23 C++ - 多个对象构造和析构
25 0
|
存储 IDE 开发工具
c++构造和析构
c++构造和析构
|
编译器 C++
【一、构造函数与析构函数】深度解析C++类的构造函数与析构函数调用机制
【一、构造函数与析构函数】深度解析C++类的构造函数与析构函数调用机制
342 0
|
Java
析构函数(方法)
析构函数(方法)
59 0
继承中的构造与析构
继承中的构造与析构
53 0
|
PHP C++ 开发者
析构方法|学习笔记
快速学习析构方法
103 0