处置与回收.docVIP

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
处置与回收.doc

第12章 处置与回收 一些对象需要特定的,具有粉碎性的代码来释放资源,例如打开文件,锁定,操作系统句柄,以及未托管的对象。在.NET的语法中,这个操作就叫做处置,IDisposable接口确保了他的实现。托管的内存被无用的对象占用,在这种情况下,这些内存也需要被回收利用;这个功能就是总所周知的垃圾回收,他是由CLR执行。 处置与垃圾回收的区别在于:处置通常是被人为触发的,而垃圾回收则是完全自动的。换句话说,程序员所关心的是释放文件句柄,锁定,操作系统资源等事物,而CLR则关心的是释放内存。 这一章节,我们将讨论处置和垃圾回收,并且描述C#终止器(finalizers)以及他们所提供的对处置资源进行备份的部分。最后,有关垃圾回收器的比较复杂的部分将会进行详细地分析,与此同时,我们还将介绍一些其他的内存管理方法。 12.1. IDisposable, Dispose, 和 Close The .NET Framework defines a special interface for types requiring a tear-down method: .NET Framework为那些要求有清除方法的类型定义了一个特定的接口: public interface IDisposable { void Dispose( ); } try/finally块中,对象通过调用Dispose来执行IDisposable来的时候, C#的using语句提供了一个语法上的快捷方式。例如: using (FileStream fs = new FileStream (myFile.txt, FileMode.Open)) { // ... Write to the file ... } 编译器将其转化为: FileStream fs = new FileStream (myFile.txt, FileMode.Open); try { // ... Write to the file ... } finally { if (fs != null) fs.Dispose( ); } Finally块保证了即使在有异常抛出或者代码过早退出该块的情况下也会调用Dispose方法。 写你自己定义的处置类型也很简单:执行IDisposable并且写一个Dispose方法。 public class Demo : IDisposable { public virtual void Dispose( ) { // Perform cleanup / tear-down. ... } } 我们通常会把Dispose函数声明为虚函数(对于未封装的类),以便子类型可以重写该方法,在其中添加自己的,可以粉碎资源的逻辑。当你重写一个Dispose方法的时候,你几乎都会调用base.Dispose。 12.1.1. 标准的处置语义 Framework在他的处置逻辑中遵守一套实际的规则。但是这些规则不是framework或者c#语言固有的规则;他们的目的是对用户定义一种一致性的协议。他们是: * 某个对象一旦被处置后,就不能再恢复。他不能被重新激活,并且调用他的方法或者属性可能抛出异常或者得到不正确的结果。 * 重复调用一个对象的Dispose方法不会造成错误。 * 如果一个被处置的对象X包含或“交换”或“处理”可处置的对象y, x的Dispose方法会自动调用y的Dispose方法-除非进行另外的说明。 这些规则尽管不是必备的,但是在程序员写自己的类型时也同样有用。除了同事的责备,没有什么能阻止你写一个Undispose方法。 根据规则3,一个容器对象会自动地处置他的子对象。一个好的示例是一个Windows容器能控制如Form或者Panel。这个容器能承载许多子控件,但是你仍然不能处置他们的每个子控件:关闭或处置父控件或窗体需要考虑所有因素。另外的一个示例是当你在DeflateStream 交换FileStream的时候,处置DeflateStream也会处置FileStream—除非你在构造函数里另外说明。 . Close 和Stop 一些类型在Dispose上定义了一个叫做Close的方法。Framework对于Close方法,在语义上不具有完全的一致性,尽管所有情况下他都只是以下两种: 功能上与对于Dispose相同 是Dispose的一个功能子集 接下来的一个例子是IDbConnection:一个已经关闭的连接可以重新打开;而一个已处置的连接不行。另外一个例子就是一个Windows Form通过ShowDialog被激活:Close将其隐藏,Dispose释放其资源。 一些类定义了一个Stop方法(如Tim

文档评论(0)

aiwendang + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档