非托管资源

非托管资源
    对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们.

     垃圾回收器不知道如何释放非托管的资源(例如文件旬柄、网络连接和数据库连接)。托管类在封装对非托管资源的直接或间接引用时,需要制定专门的规则,确保非托管的资源在回收类的一个实例时释放。

      在定义一个类时,可以使用两种机制来自动释放非托管的资源。这些机制常常放在一起实现,

因为每种机制都为问题提供了略为不同的解决方法。这两种机制是:

     · 声明一个析构函数(或终结器),作为类的一个成员

     · 在类中实现system.IDisposable 接口

 析构函数

     在C#中的析构函数时,在底层的.net体系结构中,这些函数称为终结器.在C#定义析构函数时,编译器发送给程序集的实际上是Finalizer()方法。

     但由于使用C#垃圾回收器的工作方式,无法确定C#对象的析构函数何时执行。所以,不能在析构函数中放置需要在某一时刻运行的代码,也不应使用能以任意顺序对不同类的实例调用的析构函数。如果对象占用了宝贵而重要的资源,应尽快释放这些资源,此时就不能等待垃圾回收器来释放了。

另一个问题是C#析构函数的实现会延迟对象最终从内存中删除的时间。没有析构函数的对象会

在垃圾回收器的一次处理中从内存中删除,但有析构函数的对象需要两次处理才能销毁:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。另外,运行库使用一个线程来执行所有对象的Finalize()方法。如果频繁使用析构函数,而且使用它们执行长时间的清理任务,对性能的影响就会非常显著。

 system.IDisposable 接口

实现代码如下:

c1ass MyClass: IDisposable

{

Public void Dispose()

(

// implementation

)

)

Dispose()方法的实现代码显式地释放由对象直接使用的所有非托管资源,并在所有也实现
IDisposable 接口的封装对象上调用Dispose()方法。这样,Dispose()方法为何时释放非托管资源提供
了精确的控制。

Dispose()方法有第二个protected重载方法,它带一个布尔参数,这是真正完成清理工作的方法。Dispose(bool)方法由析构函数和IDisposable.Dispose()方法调用。这种方式的重点是确保所有的清理代码都放在一个地方。

传递给Dispose(bool)方法的参数表示Dispose(bool)方法是由析构函数调用,还是由IDisposable.

Dispose(bool)方法调用——Dispose(bool)方法不应从代码的其他地方调用,其原因是:

● 如果使用者调用IDisposable.Dispose()方法,该使用者就指定应清理所有与该对象相关的资

源,包括托管和非托管的资源。

● 如果调用了析构函数,原则上所有的资源仍需要清理。但是在这种情况下,析构函数必须由垃圾回收器调用,而且用户不应试图访周其他托管的对象,因为我们不再能确定它们的状态了。在这种情况下,最好清理己知的非托管资源,希望任何引用的托管对象还有析构函数,这些析构函数执行自己的清理过程。

isDisposed成员变量表示对象是否己被清理,并确保不试图多次清理成员变量。


最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值