C# 的析构

Posted 亦翔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 的析构相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

 

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

 

以上是关于C# 的析构的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的析构函数中恢复对象?

C# 使用 AWS lambda 时,我可以确定函数中的析构函数会被执行吗?

dotnet C# 如果在构造函数抛出异常 析构函数是否会执行

mfc 类的析构函数

基类的析构函数写成virtual虚析构函数

在一个派生类对象结束其生命周期时析构函数的调用顺序