个方法 (以下通过Reflector继续) c.Finalize方法中有 this._handle.Dispose()代码﹐于是调用SafeHandler.Dispose() d.接着转到(当然好多个圈﹐您悠着点...)SafeFileHandle.ReleaseHandle方法﹐发现代码﹕Win32Native.CloseHandle() (即关闭非托管资源--文件HANDLE)
真相大白﹕原来是垃圾收集器帮我们关闭了那个非托管资源(当然还是通过我们自己写的Finalize方法)﹐因此后面就可以删除文件了。
11.有人会问﹕好像我们平时在使用FileStream对象时﹐没这么复杂呀? 答﹕Very Good!
一部分人﹕是因为大家都和我的例1一样有好运气﹐那个C盘下的test.txt文件自从被创建后﹐我压根就不会再去用它﹐管它这部分资源有没有被泄漏﹐有没有被锁定﹐最后程序结束时﹐被垃圾收集器帮了忙﹐把忘了关闭的文件HANDLE给收回来了。
剩下的一部分人﹕在程序里埋下了一颗"哑弹"﹐不知什么时候会爆炸﹐就像我例子中的File.Delete方法就出现了异常。
(不过我觉得)绝大多数人﹕是在看了很多诸如.net编程忠告﹐Microsoft强烈建议﹐MSDN标准做法等等等等( 还有我这篇blog﹐呵呵)之后﹐知道了在使用如FileStream,SqlConnection这些东东时﹐必须将其Close。
12.Close与Dispose 查看我们那两个例子的代码﹐都是不标准的﹐正确做法应该在使用完那个FileStream后﹐调用fs.Close()将其关闭﹐以保证资源的安全。
附﹕正确做法
1using System; 2using System.IO; 3 4public class TestFileStream 5{ 6 public static void Main(string[] args) 7 { 8 //创建一个FileStream对象 9 FileStream fs = new FileStream(@"C:\test.txt", FileMode.OpenOrCreate); 10 11 /**//*在用完FileStream后关闭*/ 12 fs.Close(); 13 14 //删除文件测试 15 try 16 { 17 File.Delete(@"c:\test.txt"); 18 } 19 catch (IOException ex) 20 {
上一页 [1] [2] [3] [4] [5] 下一页 |