浅谈C#内存回与Dispose﹐Close﹐Finalize方法.doc

浅谈C#内存回与Dispose﹐Close﹐Finalize方法.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅谈C#内存回与Dispose﹐Close﹐Finalize方法

浅谈C#内存回收与Dispose﹐Close﹐Finalize方法 .net内存回收与Dispose﹐Close﹐Finalize方法 一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ FileStream?fs 这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因为要存一个对象的地址) 3.初始化对象 对象在使用(调用其方法或属性)前﹐必须进行初始化。 如﹕ fs?=?new?FileStream(@C: est.txt,FileMode.OpenOrCreate); 这行代码会分成3个步骤﹕ a.在托管堆中分配一块内存﹐其大小等于FileStream中所有字段(当然不包括静态的)的内存总和加上MS认为需要的其它东东。 b.初始化对象的字段(值类型的把其位全部初始化成0,对象初始化为null﹐当然string是一个例外﹐它被初始化成空字符串) c.调用FileStream相应的构造器﹐这里会初始化一个非托管资源(文件)的私有字段。 三.使用对象 使用对象就没什么讲的﹐就是调用对象的方法(或属性等)来完成某个功能当然为了释放对象而调用的方法其范畴应不属于此类中(现在提到的Finalize等) 四.释放对象 1.释放对象也就是说这个对象我已经不需要了﹐现在我要把其释放﹐以便把其在堆上所占用的内存空间给收回来(当然变量名的内存空间就不需要管了﹐因为它会随其作用域自动消失) 2. .net自动进行内存管理﹐也就是说当它判断一个对象没有用了(当然有自己的算法)﹐它就会将其内存给自动收回来﹐但是其收回的时间一般不确定(当.net认为内存紧张时﹐它就会开始) BTW:其实我们就是想自己收回对象的内存也不可能﹐因为MS没有提供途径(GC.Collect也是启动.net的内存收集功能) 五.第一个结论 在net中使用对象很简单﹐创建对象之后直接使用就可以了﹐不用了也不要去管它﹐垃圾收集器会帮你把内存要回来的。 六.例外 当对象的成员引用了一个非托管资源时(不在托管堆上分配的内存或资源﹐像文件﹐数据库连接等等)﹐下面以一个例子来说明﹕ System.IO.FileStream类别﹐这是.net基本类库提供的一个非托管资源(文件)封装对象(用Reflector工具反编译mscorlib.dll可见其代码) 1.FileStream毫无疑问封装了一个非托管资源 观其源代码发现有这样一个私有成员﹕ private?SafeFileHandle?_handle; ?通过构造器调用的Init方法可以发现这个成员的初始化代码﹕ this._handle?=?Win32Native.SafeCreateFile(text2,?num1,?share,?secAttrs,?mode,?num2,?? Win32Native.NULL); ?而后者实际上就是kernel32.dll中的CreateFile方法﹐它返回一个HANDLE(即非托管资源引用) 2.我们先来使用这个类别﹕ using?System; ?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盘下的test.txt(回车键继续)); ????????//暂停程序执行﹐并尝试在系统中删除那个文件 ????????Console.ReadLine(); ??????//删除文件测试 ???????try ???????...{ ??????????File.Delete(@c: est.txt); ??????} ???????catch?(IOException?ex) ???????...{ ???????????Console.WriteLine([Error]程序删除文件失败﹕{0},ex.Message); ???????} ????} } 3.在程序挂起时(Console.ReadLine等待输入)﹐删除文件会失败﹐很容易理解﹐因为文件打开后没有将其关闭﹐系统不知道这个文件是否还有用﹐所以帮我们保护这个文件(理所当然﹐那个非托管资源所使用的内存还被程

您可能关注的文档

文档评论(0)

sxa632 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档