• λ我爱Aspx >> Asp.Net >> 利用C#实现标准的 Dispose模式
  • 利用C#实现标准的 Dispose模式

  • :未知  Դ:internet  :2007-5-20 16:43:42  ؼ:c#
  • 实现IDisposable接口是一种标准的途径,它通知用户和运行时系统持有资源的对象必须及时地释放。IDisposable接口仅仅包含一个方法:

    public interface IDisposable

    {

    void Dispose( );

    }

    你对IDisposable.Dispose()方法的实现(implementation)负责下面四个事务:

    1、释放所有的非受控资源。

    2、释放所有的受控资源(包括未解开事件)。

    3、设置标志表明该对象已经被处理过了。你必须在自己的公共方法中检查这种状态标志并抛出ObjectDisposed异常(如果某个对象被处理过之后再次被调用的话)。

    4、禁止终结操作(finalization)。你调用GC.SuppressFinalize(this)来完成这种事务。

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

    但是在你建立的这种机制中仍然存在一些问题。怎样在衍生类清理自己资源的时候同时也让基类能够清理资源?如果衍生类重载了终结操作,或者添加了自己的IDisposable实现,那么这些方法必须调用基类,否则,基类就不能正确地进行清理操作。同样,finalize(终结操作)和Dispose参与分担了一些相同的职责。Finalize方法和Dispose方法的代码几乎相同。而且在重载接口函数后并不像你预料的那样工作。标准的Dispose模式中的第三个方法是一个受保护的虚拟辅助函数,它分解出这些共同的事务,并给衍生类添加一个用于释放资源的"钩子(hook)"。基类包含了核心接口的代码。作为对Dispose()或终结操作的响应,该虚拟函数为衍生类清除资源提供了"钩子":

    Ҷƪл˵?
  • һƪ用C#的Raw Socket实现网络封包监视
    һƪ关于C#中属性及值类性引用类型的讨论