.net非托管资源的回收方法非托管资源的回收方法
本文实例讲述了.net非托管资源的回收方法,分享给大家供大家参考。具体分析如下:
释放未托管的资源有两种方法
1、析构函数
2、实现System.IDisposable接口
一、析构函数
构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数。析构函数初看起
来似乎是放置释放未托管资源、执行一般清理操作的代码的最佳地方。但是,事情并不是如此简单。由于垃圾回收器的运行规
则决定了,不能在析构函数中放置需要在某一时刻运行的代码,如果对象占用了宝贵而重要的资源,应尽可能快地释放这些资
源,此时就不能等待垃圾收集器来释放了.
实例
代码如下:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MemRelease
{
class Program
{
~Program()
{
// Orders.
}
static void Main(string[] args)
{
}
}
}
在IL DASM中,你会发现并没有这个析构的方法。C#编译器在编译析构函数时,会隐式地把析构函数的代码编译为Finalize()
方法的对应代码,确保执行父类的Finalize()方法 看下这段代码中对于析构函数的编译:
代码如下:.method family hidebysig virtual instance void
Finalize() cil managed
{
// Code size 14 (0xe)
.maxstack 1
.try
{
IL_0000: nop
IL_0001: nop
IL_0002: leave.s IL_000c
} // end .try
finally
{
IL_0004: ldarg.0
IL_0005: call instance void [mscorlib]System.Object::Finalize()
IL_000a: nop
IL_000b: endfinally
} // end handler
IL_000c: nop
IL_000d: ret
} // end of method Program::Finalize
使用析构函数来释放资源有几个问题:
1、与C++析构函数相比,C#析构函数的问题是他们的不确定性。在删除C++对象时,其析构函数会立即执行,但是由于垃圾
收集器的工作方式,无法确定C#对象的析构函数何时执行。
2、C#析构函数的执行会延迟对象最终从内存中删除的时间。有析构函数的对象需要2次处理才能删除:第一次调用析构函数
时,没有删除对象,第二次调用才真正删除对象。
二、IDisposable接口