浅谈c#内存回收与dispose﹐close﹐finalize方法

浅谈c#内存回收与dispose﹐close﹐finalize方法

ID:15861902

大小:107.50 KB

页数:9页

时间:2018-08-06

浅谈c#内存回收与dispose﹐close﹐finalize方法_第1页
浅谈c#内存回收与dispose﹐close﹐finalize方法_第2页
浅谈c#内存回收与dispose﹐close﹐finalize方法_第3页
浅谈c#内存回收与dispose﹐close﹐finalize方法_第4页
浅谈c#内存回收与dispose﹐close﹐finalize方法_第5页
资源描述:

《浅谈c#内存回收与dispose﹐close﹐finalize方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、浅谈C#内存回收与Dispose﹐Close﹐Finalize方法.net内存回收与Dispose﹐Close﹐Finalize方法一.net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对象二.创建对象1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象2.变量类型宣告(declare),如﹕FileStream fs这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因为要存一个对象的地址)3.初始化对象对象在使用(调用其方法或属性)前﹐必须进行初始化。如﹕fs =

2、 new FileStream(@"C:est.txt",FileMode.OpenOrCreate);这行代码会分成3个步骤﹕a.在托管堆中分配一块内存﹐其大小等于FileStream中所有字段(当然不包括静态的)的内存总和加上MS认为需要的其它东东。b.初始化对象的字段(值类型的把其位全部初始化成0,对象初始化为null﹐当然string是一个例外﹐它被初始化成空字符串)c.调用FileStream相应的构造器﹐这里会初始化一个非托管资源(文件)的私有字段。三.使用对象使用对象就没什么讲的﹐就是调用对象的方法(或

3、属性等)来完成某个功能当然为了释放对象而调用的方法其范畴应不属于此类中(现在提到的Finalize等)四.释放对象1.释放对象也就是说这个对象我已经不需要了﹐现在我要把其释放﹐以便把其在堆上所占用的内存空间给收回来(当然变量名的内存空间就不需要管了﹐因为它会随其作用域自动消失)2..net自动进行内存管理﹐也就是说当它判断一个对象没有用了(当然有自己的算法)﹐它就会将其内存给自动收回来﹐但是其收回的时间一般不确定(当.net认为内存紧张时﹐它就会开始)BTW:其实我们就是想自己收回对象的内存也不可能﹐因为MS没有提供

4、途径(GC.Collect也是启动.net的内存收集功能)五.第一个结论在net中使用对象很简单﹐创建对象之后直接使用就可以了﹐不用了也不要去管它﹐垃圾收集器会帮你把内存要回来的。六.例外当对象的成员引用了一个非托管资源时(不在托管堆上分配的内存或资源﹐像文件﹐数据库连接等等)﹐下面以一个例子来说明﹕System.IO.FileStream类别﹐这是.net基本类库提供的一个非托管资源(文件)封装对象(用Reflector工具反编译mscorlib.dll可见其代码)1.FileStream毫无疑问封装了一个非托管资

5、源观其源代码发现有这样一个私有成员﹕private SafeFileHandle _handle; 通过构造器调用的Init方法可以发现这个成员的初始化代码﹕this._handle = Win32Native.SafeCreateFile(text2, num1, share, secAttrs, mode, num2,  Win32Native.NULL); 而后者实际上就是kernel32.dll中的CreateFile方法﹐它返回一个HANDLE(即非托管资源引用)2.我们先来使用这个类别﹕using Sys

6、tem; using System.IO;  public class TestFileStream ...{    public static void Main(string[] args)    ...{              //创建一个FileStream对象        FileStream fs = new FileStream(@"C:est.txt",FileMode.OpenOrCreate);               Console.WriteLine("您可以尝试在系统中删除c盘下的

7、test.txt(回车键继续)");        //暂停程序执行﹐并尝试在系统中删除那个文件        Console.ReadLine();      //删除文件测试       try       ...{          File.Delete(@"c:est.txt");      }       catch (IOException ex)       ...{           Console.WriteLine("[Error]程序删除文件失败﹕{0}",ex.Message);     

8、  }    }}3.在程序挂起时(Console.ReadLine等待输入)﹐删除文件会失败﹐很容易理解﹐因为文件打开后没有将其关闭﹐系统不知道这个文件是否还有用﹐所以帮我们保护这个文件(理所当然﹐那个非托管资源所使用的内存还被程序占用着)4.但是在程序执行完后﹐我们再尝试删除文件﹐成功﹗为什么?(fs不是没有关闭那个SafeFileHand

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。