C#种 Dispose 和 Close 有什么不同
在 .NET 中有一个很有意思的现象,有些类中同时存在 Close 和 Dispose 两种释放资源的方法,那么它们哪一个更适合做资源清理呢?下面我就来解答一下。
以 SreamReader 为例,我们用 Reflector 来查看该类中的 Close 方法,会发现它其实就是调用 Dispose 方法,并传入参数值 true ,因此如果我们不使用 Using 语句清理资源的话(Using 语句块使用 Dispose 方法清理资源),手动调用 Close 方法的效果基本上和 Dispose 方法是一样的。这里有一点要提一下,使用 using 语句来调用 Dispose 方法,那么资源一定能被释放,如果希望在资源用完后马上释放的话,就必须手动调用 Close 方法。在这里 using 和 close 方法可以同时存在,但 close 必须在 using 语句快结束前调用。
那么, Close 和 Dispose 两个方法都一样,为什么两个都要存在呢?其实我们去看 Dispose 方法和 Close 方法的源码会发现, Dispose 比 Close 多了行 **GC.SuppressFinalize(this)** 代码,这行代码的意思是通知 GC 当发现 SreamReader 无引用根时不要将它放入队列中,这样就避免了终结器线程再次对它处理,这也减轻了终结器线程的负担。
版权声明: 本文为 InfoQ 作者【喵叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/415aaf3bdaf6d8b4f1f91b710】。未经作者许可,禁止转载。
评论