C# 的析构

首先介绍下关于C#的GC垃圾回收器,有了这个垃圾回收器c#的开发人员可以不用像C++开发人员那样关心垃圾回收!

但是GC是把双刃剑,GC仅仅对于托管资源进行管理,对非托管资源却无能为力,并且C#的开发人员也不太容易了解内部垃圾是何时回收的,这样就不利于管理!

下面是非托管资源,对于托管资源可以不太担心,但是编程时遇到非托管资源可要注意了!

有了上面的阐述,大家就可以很好的理解C#代码中为什么很少有析构函数,因为有了析构这个东东!

在C++编程中,析构是立即执行但是在C#中由于垃圾回收器的存在导致无法确定析构函数是何时执行的!

忘了说了一点,在没有析构函数的对象中垃圾回收器会一次性的把这些资源从内存中删除,当有了析构函数是需要两次才能删除掉内存中的东西,第一次调用析构函数并没有删除对象,第二次才真正的删除对象!  所以在C#很少有析构函数,,并且最重要的是频繁使用析构函数,则会执行更长时间的清理任务,对性能来说可能是致命的!

对于非托管资源,我们可以创建一个Close函数,然后在外界调用直接先清除非托管资源,然后在把对象=null;

时间: 2024-08-01 07:31:55

C# 的析构的相关文章

构造器和析构器

一 构造器 swift的init方法是没有返回值的,而OC的init方法就有返回值,返回类本身 1.默认构造器 即使我们不写init方法,系统也会为函数默认写一个空的init方法 struct Fahrenheit {          var temperature:Double          init(){         temperature = 32.0     } } var f = Fahrenheit() 2.自定义构造器 struct Celsius {          

继承的构造和析构顺序

程序示例 1 #include <iostream> 2 using namespace std; 3 class a 4 { 5 public: 6 a(){cout<<"构造a"<<endl;} 7 ~a(){cout<<"析构a"<<endl;} 8 }; 9 class b 10 { 11 public: 12 b(){cout<<"构造b"<<endl;

C++多重继承中构造函数和析构函数调用顺序举例

//多重继承 #include <iostream> using namespace std; class A { public:     A()     {         cout<<"A基类构造A::A()"<<endl;     }     ~A()     {         cout<<"A基类析构A::~A()"<<endl;     } }; class B:public A { publi

构造方法与析构方法区别

Java构造方法 类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量.在创建对象时,会自动调用类的构造方法.构造方法定义规则:Java 中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有void).另外,构造方法一般都应用 public 类型来说明,这样才能在程序任意的位置创建类的实例也就是对象.示例:下面是一个 Rectangle 类的构造方法,一个是带有两个参数,分别表示矩形的长和宽: 另一个是不带参数:public class Rectangle {

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

学习Swift -- 析构过程

析构过程 析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用.析构器用关键字deinit来标示,类似于构造器要用init来标示. 原理 Swift 会自动释放不再需要的实例以释放资源,Swift 通过自动引用计数(ARC)处理实例的内存管理.通常当你的实例被释放时不需要手动地去清理.但是,当使用自己的资源时,你可能需要进行一些额外的清理.例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前手动去关闭该文件. deinit { // 在这里实现

C++ 类、构造析构、深拷贝

1st,感性理解类的思想,就是把数据和对数据的操作打包在一块儿,设计类的时候要 想好数据部分和 要进行的操作.以下是时间类的示意,时间包含时分秒,Time为构造函数,该类支持的操作就是设置时间和读取时间,static类型记录对象数量,static机制查询相关书籍. //Time.h #ifndef Time_h #define Time_h class Time { public: Time(int h = 0, int m = 0, int s = 0); void SetTime(int,

Python构造器及析构器:__init__与__new__及__del__

__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__.__new__是负责实例化对象的,而__init__是初始化操作.__del__是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__执行. class CapStr(str): def __new__(cls, string): #此时string = 'i love you' cls是CapStr这

再探Delphi2010 Class的构造和析构顺序

发了上一篇博客.盒子上有朋友认为Class的构造和析构延迟加载.是在Unit的初始化后调用的Class的构造.在Unit的反初始化前调用的Class的析构函数. 为了证明一下我又做了个试验 unit Unit2; interface Type  TClassTest = class    class constructor create();    class destructor destory();  end; implementationuses  Windows; { TClassTes

【C++】类和对象(构造与析构)

类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: 公有类型:由关键字public声明,在类外只能访问公有成员. 私有类型:由关键字private声明,私有成员只能被类本身的成员函数访问. 保护类型:由protect声明,与私有成员类似,区别仅在于继承过程中,保护类型的成员可以被所在类的派生类成员函数访问. 此处注意区分类的成员函数和类对象. 一般来