WEB开发网
开发学院软件开发C语言 Effective C# 原则18:实现标准的处理(Dispose)模... 阅读

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

 2009-02-19 08:16:44 来源:WEB开发网   
核心提示: 实现IDisposable接口是一个标准的模式来告诉用户和进行时系统:你的对象占有资源而且必须及时的释放,IDisposable接口只有一个方法:public interface IDisposable{void Dispose( );}实现IDisposable.Dispose()方法有

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

public interface IDisposable
{
 void Dispose( );
}

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

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

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

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

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

通过实现IDisposable接口,你写成了两件事:第一就是提供了一个机制来及时的释放所有占用的托管资源(译注:这里就是指托管资源,当实现了这个接口后,可以通过调用Dispose来立即释放托管资源),另一个就是你提供了一个标准的模式让用户来释放非托管资源。这是十分重要的,当你在你的类型上实现了IDisposable接口以后,用户就可以避免析构时的损失。你的类就成了.Net社区中表现相当良好的成员。

但在你创建的机制中还是存在一些漏洞。如何让一个派生类清理自己的资源,同时还可以让基类很好的再做资源清理呢?(译注:因为调用Dispose方法时,必须调用基类的Dispose,当然是在基类有这个方法时。但前面说过,我们只有一个标记来标识对象是否处理过,不管先调用那个,总得有一个方法不能处理这个标记,而这就存在隐患) 如果基类重载了析构函数,或者自己添加实现了IDisposable接口,而这些方法又都是必须调用基类的方法的;否则,基类无法恰当的释放资源。同样,析构和处理共享了一些相同的职责:几乎可以肯定你是复制了析构方法和处理方法之间的代码。正如你会在原则26中学到的,重载接口的方法根本没有如你所期望的那样工作。Dispose标准模式中的第三个方法,通过一个受保护的辅助性虚函数,制造出它们的常规任务并且挂接到派生类来释放资源。基类包含接口的核心代码, 派生类提供的Dispose()虚函数或者析构函数来负责清理资源:

上一页  1 2 3 4 5  下一页

Tags:Effective 原则 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接