Effective C#原则18:实现标准的处理(Dispose)模式

我们已经讨论过,处理一个占用了非托管资源对象是很重要的。现在是时候 来讨论如何写代码来管理这些类占用的非内存资源了。一个标准的模式就是利用 .Net框架提供的方法处理非内存资源。你的用户也希望你遵守这个标准的模式。也就是通过实现IDisposable接口来释放非托管的资源,当然是在用户记得调用 它的时候,但如果用户忘记了,析构函数也会被动的执行。它是和垃圾回收器一 起工作的,确保在一些必要时候,你的对象只会受到因析构函数而造成的性能损 失。这正是管理非托管资源的好方法,因此有必要彻底的弄明白它。

处 在类继承关系中顶层的基类应该实现IDisposable接口来释放资源。这个类型也 应该添加一个析构函数,做为最后的被动机制。这两个方法都应该是用虚方法来 释放资源,这样可以让它的派生类重载这个函数来释放它们自己的资源。派生类 只有在它自己须要释放资源时才重载这个函数,并且一定要记得调用基类的方法 。

开始时,如果你的类使用了非内存资源,则一定得有一个析构函数。 你不能指望你的用户总是记得调用Dispose方法,否则当他们忘记时,你会丢失 一些资源。这或许是因为他们没有调用Dispose的错误,但你也有责任。唯一可 以确保非内存资源可以恰当释放的方法就是创建一个析构函数。所以,添加一个 析构函数吧!

当垃圾回收器运行时,它会直接从内存中移除不用析构的垃 圾对象。而其它有析构函数的对象还保留在内存中。这些对象被添加到一个析构 队列中,垃圾回收器会起动一个线程专门来析构这些对象。当析构线程完成它的 工作后,这些垃圾对象就可以从内存中移除了。就是说,须要析构的对象比不须 要析构的对象在内存中待的时间要长。但你没得选择。如果你是采用的这种被动 模式,当你的类型占用非托管资源时,你就必须写一个析构函数。但目前你还不 用担心性能问题,下一步就保证你的用户使用更加简单,而且可以避免因为析构 函数而造成的性能损失。

实现IDisposable接口是一个标准的模式来告诉 用户和进行时系统:你的对象占有资源而且必须及时的释放。IDisposable接口 只有一个方法:

public interface IDisposable
{
  void Dispose( );
}

实现IDisposable.Dispose()方法有责 任完成下面的任务:

1、感知所有的非托管资源。

2、感知所有的 托管资源(包括卸载一些事件)。

3、设置一个安全的标记来标识对象已经 被处理。如果在已经处理过的对象上调用任何方法时,你可以检验这个标记并且 抛出一个ObjectDisposed的异常。

4、阻止析构。你要调用 GC.SuppressFinalize(this)来完成最后的工作。

时间: 2024-12-04 06:22:40

Effective C#原则18:实现标准的处理(Dispose)模式的相关文章

Effective C#原则45:选择强异常来保护程序

当你抛出异常时,你就在应用程序中引入了一个中断事件.而且危机到程序 的控制流程.使得期望的行为不能发生.更糟糕的是,你还要把清理工作留给最 终写代码捕获了异常的程序员.而当一个异常发生时,如果你可以从你所管理的 程序状态中直接捕获,那么你还可以采取一些有效的方法.谢天谢地,C#社区不 须要创建自己的异常安全策略,C++社区里的人已经为我们完成了所有的艰巨的 工作.以Tom Cargill的文章开头:"异常处理:一种错误的安全感觉, " 而且Herb Sutter,Scott Meyer

Effective C#原则16:垃圾最小化

垃圾回收器对内存管理表现的非常出色,并且它以非常高效的方法移除不再 使用的对象.但不管你怎样看它,申请和释放一个基于堆内存的对象总比申请和 释放一个不基于堆内存的对象要花上更多的处理器时间.你可以给出一些严重的 性能问题,例如应用程序在某个方法内分配过量的引用对象. 你不应该 让垃圾回收器超负荷的工作,为了程序的效率,你可以使用一些简单的技巧来减 少垃圾回收器的工作.所有的引用类型,即使是局部变量,都是在堆上分配的. 所有引用类型的局部变量在函数退出后马上成为垃圾,一个最常见的"垃 圾"

贫二代的18条标准看看自己属于哪一种

23日上午,<"贫二代"的标准>一文已被 网友广泛转载.而该博文作者石述思是北京某媒体工作者. 石述思对穷二代的定义是:那些在改革开放中没有致富的产业工人或者农民,他们的子女如今有很多仍属于弱势群体,他们广泛地存在于城市和农村之中.他说:"如果符合其中部分标准,那就需要高度警惕,努力鼓起生活的风帆,最终还要靠你的努力."据<华商报> 石述思博文中"穷二代"的18个标准: 1.在各种"拼爹"(注:比拼老爹

《深入理解JavaScript》——1.18 标准库的其他功能

1.18 标准库的其他功能 JavaScript的标准库相对简陋,但是有许多我们可以使用的: Date(第20章) 一个日期构造器,主要功能是解析和创建日期字符串和访问组件的日期(年.小时等). JSON&lt(第22章) 一个可以解析和生成JSON数据的对象. console.*系列方法(参考23.5"ConsoleAPI") 这些浏览器特定的方法不是这个语言的一部分,但是有一些同样可以运行在Node.js中.

利用C#实现标准的Dispose模式

标准 本文讲解的是你在建立包含内存以外资源的类型,特别是处置非内存资源的时候,如何编写自己的资源管理代码. 我们已经知道了处置那些占用非受控(unmanaged)资源的对象的重要性,现在应该编写资源管理代码来处置那些包含非内存资源的类型了.整个.NET框架组件都使用一个标准的模式来处理非内存资源.使用你建立的类型的用户也希望你遵循这个标准的模式.标准的处理模式的思想是这样的:当客户端记得的时候使用IDisposable接口释放你的非受控资源,当客户端忘记的时候防护性地使用终结器(finalize

利用C#实现标准的 Dispose模式

标准 本文讲解的是你在建立包含内存以外资源的类型,特别是处置非内存资源的时候,如何编写自己的资源管理代码. 我们已经知道了处置那些占用非受控(unmanaged)资源的对象的重要性,现在应该编写资源管理代码来处置那些包含非内存资源的类型了.整个.NET框架组件都使用一个标准的模式来处理非内存资源.使用你建立的类型的用户也希望你遵循这个标准的模式.标准的处理模式的思想是这样的:当客户端记得的时候使用IDisposable接口释放你的非受控资源,当客户端忘记的时候防护性地使用终结器(finalize

视频分享网站是标准的1.0模式

视频分享网站土豆在前一阵子进行了一次改版.单个视频文件播放的时候,它的底色是黑的.我向来很喜欢黑色底版的网页(仅仅从视觉上,我知道黑底白字不适合阅读),黑色页面会让人感觉很cool也很shock.土豆看来明白这一点.在保持首页的白底风格的同时,它的storypage变黑了. 有一阵子,土豆弄来了一点广告赞助,它将这个广告赞助衬在视频文件背后.用户在欣赏那些视频的同时,会看到后面大大的广告.这是一个不错的创新.估计是从那些电视连续剧下方一直出现的赞助商logo上得到的启发.网络视频都是些几分钟的小

改善C#程序的建议4:C#中标准Dispose模式的实现

原文:改善C#程序的建议4:C#中标准Dispose模式的实现 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不受CLR管理的对象,windows内核对象,如文件.数据库连接.套接字.COM对象等: 毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那么,就需要让类型继承接口IDisposable.这相当于是告诉调用者,该

Effective C#原则50:了解ECMA标准

ECMA标准是C#语言所有功能的官方说明.ECMA-334定义了C#语言1.0的标准, 你可以从The C# Programming Language这本书上学习C#2.0的计划(译注:现在 已经不是计划了),这本书的作者是Anders Hejlsberg, Scott Wiltamuth, 和 Peter Golde (Addison-Wesley, 2003).这本书是一个语言手册,而不是指南. 它详细说明了这门语言书面定义的每一个功能.每一种语言都只一种标记,可以 让你更加明白每一种语言的