这篇文章做为我在园子里发表的第一篇文章,可能很多园友们都写过类似的文章,我也想写一写下自己对非托管资源进行及时释放的初浅看法。

MSDN里对其的定义:定义一种释放分配的资源的方法。(注意:是释放资源,不是释放内存)

补充:C#中的资源分为两种,第一:托管资源(由CLR进行管理的)、第二:非托管资源(Windows文件,数据库连接等)。

下面,我用一个例子来说明如果不及时释放的掉资源的后果.

1 FileStream fs = new FileStream(@"D:/jinpingmei.txt",FileMode.Open);//创建一个文件流并且打开文件

2 byte[] charByte = new byte[1024];//创建一个字节数组

3 fs.Read(charByte, 0,charByte.Length);//将文件内容放入到字节数组中

4 string str = Encoding.Default.GetString(charByte);//将字节数组解码成字符串

5 Console.WriteLine(str);//打印文件内容

6 Console.ReadKey();

View Code

运行结果:

把文件里的内容给输出到控制台上,注意,此时我并没有释放掉资源,此时我们在打开一个应用程序,运行相同的代码会发现出现了一个异常

该异常的意思是说,要打开的文件正处于打开状态,无法进行访问,试想一下,假设现在有一个需求是浏览一篇文章(假设文章是以本地txt文件的形式存储的),这时有一位用户正处于访问状态,如果第二位也想看这篇文章,你们说会出现什么样的问题?答案已经出来了。所以.我们应当在读取完文件后立即对资源的释放。修改过的代码:

1 FileStream fs = new FileStream(@"D:/jinpingmei.txt",FileMode.Open);//创建一个文件流并且打开文件

2 byte[] charByte = new byte[1024];//创建一个字节数组

3 fs.Read(charByte, 0,charByte.Length);//将文件内容放入到字节数组中

4 string str = Encoding.Default.GetString(charByte);//将字节数组解码成字符串

5 Console.WriteLine(str);//打印文件内容

6 fs.Dispose();//释放资源

7 Console.ReadKey();

View Code

再执行相同的操作会发现,程序正常的运行。

另外说一下,有些非托管资源类是没有Dispose()方法的,但是有Close()方法,Close()方法的内部实际上也是调用Dispose()方法进行资源的释放,还有using语句(语法糖)也会调用对象里的Dispose()方法进行资源的释放。

由于第一次写文章,文笔不好,某些更详细的还没有一一的解释清楚(例如析构器之类的,后面会继续的补上),请各位别喷我(脸皮比较薄),举得例子可能会不太符合现实中的开发,本文主要是讲述在使用非托管资源的时候一定要释放掉资源。

ps:图片的文件名和代码的文件名不符合,是因为代码的文件名被和谐掉了.......不让发.