C#实现IDisposable接口浅析

开发 后端
这里介绍通过C#实现IDisposable接口你可以完成了两个事务:你为客户端及时地释放自己持有的所有受控资源提供了机制;你为客户端提供了一种释放非受控资源的标准途径。

C#语言有很多值得学习的地方,这里我们主要介绍C#实现IDisposable接口,包括介绍标准的Dispose模式等方面。

通过C#实现IDisposable接口你可以完成了两个事务:你为客户端及时地释放自己持有的所有受控资源提供了机制;你为客户端提供了一种释放非受控资源的标准途径。这是一个很大的进步。当你在类型中实现了Idisposable接口的时候,客户端可以避免终结操作的开销,你的类就成为.NET世界中的"良民"了。

但是在你建立的这种机制中仍然存在一些问题。怎样在衍生类清理自己资源的时候同时也让基类能够清理资源?如果衍生类重载了终结操作,或者添加了自己的C#实现IDisposable接口,那么这些方法必须调用基类,否则,基类就不能正确地进行清理操作。同样,finalize(终结操作)和Dispose参与分担了一些相同的职责。

Finalize方法和Dispose方法的代码几乎相同。而且在重载接口函数后并不像你预料的那样工作。标准的Dispose模式中的第三个方法是一个受保护的虚拟辅助函数,它分解出这些共同的事务,并给衍生类添加一个用于释放资源的"钩子(hook)"。基类包含了核心接口的代码。作为对Dispose()或终结操作的响应,该虚拟函数为衍生类清除资源提供了"钩子":

protected virtual void Dispose( bool isDisposing );  
  • 1.

这个重载的方法实现支持finalize和Dispose的必要事务,由于它是虚拟的,它为所有的衍生类提供了一个入口点。衍生类可以重载这个方法,为清除自己的资源提供适当的实现,同时还可以调用基类版本。当isDisposing为真(true)的时候,你可以清除受控和非受控资源,当 isDisposing为假(false)的时候,你只能清除非受控资源。在这两种情况下,你都可以调用基类的Dispose(bool)方法,让它清除自己的资源。

下面有一个简短的例子,它演示了你在实现这种模式的时候所提供的代码框架。MyResourceHog类演示了C#实现IDisposable接口、终结器的代码,并建立了一个虚拟的Dispose方法:

publicclassMyResourceHog:IDisposable  
{  
//已经被处理过的标记  
privatebool_alreadyDisposed=false;  
//终结器。调用虚拟的Dispose方法  
~MyResourceHog()  
{  
Dispose(false);  
}  
 
//IDisposable的实现  
//调用虚拟的Dispose方法。禁止Finalization(终结操作)  
publicvoidDispose()  
{  
Dispose(true);  
GC.SuppressFinalize(true);  
}  
 
//虚拟的Dispose方法  
protectedvirtualvoidDispose(boolisDisposing)  
{  
//不要多次处理  
if(_alreadyDisposed)  
return;  
if(isDisposing)  
{  
//TODO:此处释放受控资源  
}  
//TODO:此处释放非受控资源。设置被处理过标记  
_alreadyDisposed=true;  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

在受控环境中,你不必为自己建立的每个类型编写终结器,你只需要为存储非受控类型,或者包含了C#实现IDisposable接口的成员的类型编写终结器。即使你只需要Disposable接口,不需要finalizer,也应该同时实现整个模式。否则,你会使衍生类的标准 Dispose思想的实现变得很复杂,从而限制了衍生类的功能。请遵循前面谈到的标准的Dispose思想,这将使你、你的类的用户、从你的类型建立衍生类的用户的生活更加轻松。

【编辑推荐】

  1. C#窗体里调用浅谈
  2. C#调用ListEmployee命令
  3. C# CreateEmployeeDefinition()函数
  4. C#实现断点续传详细剖析
  5. C# Employee对象浅谈
责任编辑:佚名 来源: 博客园
相关推荐

2009-09-01 18:29:24

C#实现多个接口

2009-08-27 18:09:49

C#接口的实现

2009-08-27 14:29:28

显式实现接口

2024-12-02 00:53:45

IDisposabl工具接口

2009-08-27 17:59:56

C#接口定义

2009-08-07 08:53:52

C# ICloneab

2009-08-31 17:02:28

C#接口编程

2009-09-28 14:45:22

C#接口的定义

2009-08-24 15:12:13

C# 泛型接口

2009-09-02 15:34:37

C#实现插件构架

2009-08-31 16:37:20

C#接口定义

2009-08-27 13:05:06

C#接口特点C#接口实例

2009-09-18 19:21:17

C#接口

2010-01-14 17:13:53

C++接口

2009-08-31 15:55:17

C#实现Strateg

2009-08-28 15:57:56

C#线程传递参数

2009-08-21 09:20:44

C#异步套接字

2009-09-09 11:29:32

C# TextBox事

2009-08-26 09:54:45

C#打印预览C#打印

2009-09-02 17:24:44

C#关机代码
点赞
收藏

51CTO技术栈公众号