实现 Dispose 方法

原创 2004年06月23日 15:29:00

类型的 Dispose 方法应该释放它拥有的所有资源。它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。

Dispose 方法应该为它处置的对象调用 <?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" />GC.SuppressFinalize 方法。如果对象当前在终止队列中,GC.SuppressFinalize 防止其 Finalize 方法被调用。执行 Finalize 方法会大大减损性能。如果您的 Dispose 方法已经完成了清理对象的工作,那么垃圾回收器就不必调用对象的 Finalize 方法了。

Dispose(bool disposing) 以两种截然不同的方案执行。如果“处置”等于“真”,则该方法已由用户的代码直接调用或间接调用,并且可处置托管资源和非托管资源。如果“处置”等于“假”,则该方法已由运行库从终结器内部调用,并且只能处置非托管资源。

基类提供的 Finalize 方法或析构函数在未能调用 Dispose 的情况下充当防护措施。Finalize 方法调用带有参数的 Dispose 方法,同时传递“假”。

public class BaseResource: IDisposable
{
   // 非托管资源
   private IntPtr handle;
   // 托管资源
   private Component Components;
   // Track whether Dispose has been called.
   private bool disposed = false;

   public BaseResource()
   {....}
   public void Dispose()
   {
      Dispose(true);
      //因为前面Dispose(true)已经将所有资源全部释放,所以不学要再调用finalize,以节省资源。
      GC.SuppressFinalize(this);
   }
   protected virtual void Dispose(bool disposing)
   {
      if(!this.disposed)
      {
         if(disposing)
         {
            // 释放托管资源
            Components.Dispose();
         }// 释放非托管资源
         CloseHandle(handle);
         handle = IntPtr.Zero;
      }
      disposed = true;        
   }
   // 这个析构函数在Dispose没有被调用时  才被调用
   ~BaseResource()     
   {
      Dispose(false);
   }
   // 使你的Dispose方法被多次调用,但是对象如果已经disposed则将从此处抛出异常
   // 任何时候你要用对象去做任何事情你都应该检查该对象是否已经disposed
   public void DoSomething()
   {
      if(this.disposed)
      {
         throw new ObjectDisposedException();
      }
   }
}
public class MyResourceWrapper: BaseResource
{
   // 托管资源
   private ManagedResource addedManaged;
   // 非托管资源
   private NativeResource addedNative;
   private bool disposed = false;
   public MyResourceWrapper()
   {....  }
   protected override void Dispose(bool disposing)
   {
      if(!this.disposed)
      {
         try
         {
            if(disposing)
            {
               addedManaged.Dispose();        
            }
            CloseHandle(addedNative);
            this.disposed = true;
         }
         finally
         {//调用父类的dispose函数
            base.Dispose(disposing);
         }
      }
   }
}

浅析C# Dispose方法的实现

C# Dispose方法的理解是什么呢?类型的Dispose方法应释放它拥有的所有资源。它还应该通过调用其父类型的Dispose方法释放其基类型拥有的所有资源。该父类型的 Dispose 方法应该释放...
  • fxqcn
  • fxqcn
  • 2011年08月24日 22:33
  • 3131

JAVA-dispose()方法

今天在编一道JAVA例题时,看到 dispose 这个方法,在程序中是用来关闭一个GUI页面的。这也让我想到了setVisible(false)方法。 在网上查了意思,dispose()即释放所...
  • three_know
  • three_know
  • 2017年12月19日 20:36
  • 42

Dispose模式与Finalize, Dispose方法实现准则

最近一直纠结于一个Silverlight程序的内存泄露问题,顺便复习了一下Dispose模式 及Finalize, Dispose方法的实现准则 : Finalize实现准则:The follow...
  • jameszhou
  • jameszhou
  • 2010年06月07日 15:10
  • 1506

java中的dispose()方法

从JAVA 1.5 的帮助文档的原文 - dispose - public void dispose()     释放由此 Window、其子组件及其拥有的所有子组件所使用的所有本机屏幕资源。即...
  • oLinHao007
  • oLinHao007
  • 2013年12月08日 23:19
  • 7630

dispose()与System.exit(0)的区别,关闭程序

System.exit(0)是将你的整个这个虚拟机里的内容都停掉了 而dispose()只是关闭这个窗口,但是并没有停止整个application exit() 无论什么,内存都释放了!也就是...
  • lushuaiyin
  • lushuaiyin
  • 2011年10月11日 11:15
  • 1504

Effective C#原则:调用Dispose()方法

 学习C#时,经常会遇到Effective C#原则问题,这里将介绍调用Dispose()方法解决Effective C#原则问题。 Effective C#原则(一)使用非托管资源的类型必须实现ID...
  • wangchao0605
  • wangchao0605
  • 2009年11月24日 11:31
  • 3015

深入解析Close()和Dispose()的区别

很多人都认为Close()方法内部会调用Dispose()方法,所以并没有本质的区别!实际上这个看法不是很准确,对有 些类来说,的确Close()和Dispose()没有本质区别,但是对有些类来...
  • daihongshu
  • daihongshu
  • 2014年05月12日 10:46
  • 1760

c#——标准Dispose模式的实现

摘要:C#程序中的Dispose方法,一旦被调用了该方法的对象,虽然还没有垃圾回收,但实际上已经不能再使用了。所以使用上要仔细考虑细节。   需要明确一下C#程序(或者说.NET)中的资...
  • Shiyaru1314
  • Shiyaru1314
  • 2015年10月30日 17:13
  • 505

使用Dispose模式释放资源

1、资源的内存使用情况 为资源分配内存–>初始化内存,设置资源的初始状态–>访问内存,使用资源–>摧毁资源状态,释放2、资源包括托管资源和非托管资源 托管资源:由CLR管理分配和释放的资源。 非...
  • tiana0
  • tiana0
  • 2016年11月06日 10:59
  • 1325

java SWT: 重写dispose()和DisposeListener的区别

当需要在Widget被销毁(dispose)的时候执行一些比如释放资源的动作时,有两个途径来执行这些动作: 1. 重写dispose()方法,在dispose中释放资源的动作。 2. 添加Disp...
  • 10km
  • 10km
  • 2016年12月10日 14:07
  • 1231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现 Dispose 方法
举报原因:
原因补充:

(最多只允许输入30个字)