- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈C#内存回收和Dispose﹐Close﹐Finalize方法
HYPERLINK /WCFGROUP/archive/2008/05/30/1210931.html 浅谈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等待输入)﹐删除文件会失败﹐很容易理解﹐因为文件打开后没有将其关闭﹐系统不知道这
您可能关注的文档
最近下载
- 面神经减压术护理ppt.pptx
- 2025云南保山永昌康养旅居有限公司招聘11人考试模拟试题及答案解析.docx VIP
- 文献检索与论文写作课件.pptx VIP
- 2025年中国鹦鹉养殖市场动态监测及竞争战略研究报告.docx VIP
- 2025年抖音内衣泳衣类目准入考试丨抖音内衣类目达人准入考试丨抖音报白考试题库.docx VIP
- 毕业论文写作与文献检索2课件.ppt VIP
- 服装厂缝纫机资料_JUKI缝纫机辅助器制作.pdf VIP
- 神经型布鲁菌病诊治专家共识(2025版)解读课件.pptx VIP
- 毕业设计(论文)大型锤式破碎机的设计.doc VIP
- ××工程电梯井基坑施工抽水专项施工方案.doc VIP
文档评论(0)