Finalize() 和 Dispose()

引用:
http://www.7dspace.com/doc/24/0603/20063604160336160.htm
http://www.yesky.com/20030311/1656401_1.shtml
MSDN垃圾回收专题:http://msdn2.microsoft.com/zh-cn/library/0xy59wtx.aspx

一般在.NET程序中创建的托管对象,都是可以依靠GC来自动回收;但是当对象中封装了非托管资源时,就需要自己来释放。

对非托管资源的释放,可以通过Finalize()方法和IDisposable接口的Dispose()方法来实现。


Finalize()

* 析构函数会在编译时会被翻译为protected void Finalize(),这是C#的析构函数的语法

GC在回收对象之前会调用Finalize()来实现非托管资源的释放,不过按照MSDN的说法,Finalize()会导致性能的降低。

“垃圾回收器使用名为“终止队列”的内部结构跟踪具有 Finalize 方法的对象。每次您的应用程序创建具有 Finalize 方法的对象时,垃圾回收器都在终止队列中放置一个指向该对象的项。托管堆中所有需要在垃圾回收器回收其内存之前调用它们的终止代码的对象都在终止队列中含有项。

  实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存。这时,它不能回收具有终结器的不可访问对象。它改为将这些对象的项从终止队列中移除并将它们放置在标为准备终止的对象列表中。该列表中的项指向托管堆中准备被调用其终止代码的对象。垃圾回收器为此列表中的对象调用 Finalize 方法,然后,将这些项从列表中移除。后来的垃圾回收将确定终止的对象确实是垃圾,因为标为准备终止对象的列表中的项不再指向它们。在后来的垃圾回收中,实际上回收了对象的内存。” --[MSDN]


Dispose()

在Sytem.IDisposable接口中定义的方法。

使用Dispose()的规则:
1、首先,Dispose接口应该释放自身对象所占用的资源,还应该调用基类的Dispose方法,释放基类部分所占用的资源。

public void Dispose()
{
 
// do something to release my unmanaged resource
 ReleaseMyResource();

 
base.Dispose();
}

2、前面说过Finalize()会导致性能问题,那么在执行Dispose以后就应该告诉GC不用在调用Finalize()了

public void Dispose()
{
 
// do something to release my unmanaged resource
 ReleaseMyResource();
 
base.Dispose();

 
// tell gc not to call Finalize()
 GC.SuppressFinalize(this);
}




 

posted @   蛤蟆  阅读(516)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示