日期:2014-05-17  浏览次数:20815 次

C#托管资源如果都是GC负责释放的,那么Finalize的作用是什么呢?
如果非托管的资源(native)都应该在Dispose里面释放,那么有没有什么手段可以释放托管的资源?

托管资源如果都是GC负责释放的,那么岂不是没有方法能手动释放?

还请指点!

------解决方案--------------------
先.NET中的对象内存管理由垃圾回收器来进行回收的,调用GC.Collect()可以强制垃圾回收器来进行垃圾回收,因为垃圾回收器是到到内存规定的限制时才进行垃圾回收的,并不是某个对象不可用了就立即执行垃圾回收的,不过我们可以在代码中强制调用GC.Collect()来进行垃圾回收,不过不建议这样做,因为垃圾回收过程是一个复杂的过程,会影响到程序性能,而显示调用Disopose方法是时用来释放掉托管对象指向的非托管资源,如FileStream fs =new FileStream(filepath)代码,其中fs是一个托管对象,但是它指向的是一个硬盘上的具体文件,调用fs.Dispose()方法是显示用来释放非托管资源的,然后对于析构函数的调用,我们程序员不能控制其什么时候被调用,它的调用使用垃圾回收器来进行管理的,程序这边并不知道,关于垃圾回收器的更多内容可以参考CLR via C#中的垃圾回收器章节 
------解决方案--------------------
引用:
Quote: 引用:

先.NET中的对象内存管理由垃圾回收器来进行回收的,调用GC.Collect()可以强制垃圾回收器来进行垃圾回收,因为垃圾回收器是到到内存规定的限制时才进行垃圾回收的,并不是某个对象不可用了就立即执行垃圾回收的,不过我们可以在代码中强制调用GC.Collect()来进行垃圾回收,不过不建议这样做,因为垃圾回收过程是一个复杂的过程,会影响到程序性能,而显示调用Disopose方法是时用来释放掉托管对象指向的非托管资源,如FileStream fs =new FileStream(filepath)代码,其中fs是一个托管对象,但是它指向的是一个硬盘上的具体文件,调用fs.Dispose()方法是显示用来释放非托管资源的,然后对于析构函数的调用,我们程序员不能控制其什么时候被调用,它的调用使用垃圾回收器来进行管理的,程序这边并不知道,关于垃圾回收器的更多内容可以参考CLR via C#中的垃圾回收器章节 


既然有了GC回收托管资源,和Dispose回收非托管资源,那么还要析构函数(Finalize())做什么呢?

析构函数由垃圾回收器来执行的,如果一些非托管资源程序员忘记释放显示调用Dispose方法来回收资源时,如果该托管对象引用不可用时,垃圾回收器会调用析构函数来回收非托管资源,如果没有析构函数的话,这样程序员忘记释放非托管资源的话,这样将导致某些内存不可用的情况,析构函数的作用就是保证了这点,这样解释之后应该可以彻底明白了吧 
------解决方案--------------------
Finalize有太多的不确定性,因此不推荐使用了

× The exact time when the finalizer executes during garbage collection is undefined. Resources are not guaranteed to be released at any specific time, unless calling a Close method or a Dispose method.
×  The finalizers of two objects are not guaranteed to run in any specific order, even if one object refers to the other. That is, if Object A has a reference to Object B and both have finalizers, Object B might have already finalized when the finalizer of Object A starts.
× The thread on which the finalizer is run is unspecified.
The Finalize method might not run to completion or might not run at all in the following exceptional circumstances:
× Another finalizer blocks indefinitely (goes into an infinite loop, tries to obtain a lock it can never obtain and so on). Because the runtime attempts to run finalizers to completion, other finalizers might not be called if a finalizer blocks indefinitely.
× The process terminates without giving the runtime a chance to clean up. In this case, the&