.net 对象释放不会回收非托管资源,需实现dispose 模式
代码如下
 
InBlock.gif         class a : IDisposable
InBlock.gif        {
InBlock.gif                 bool disposed;
InBlock.gif
InBlock.gif                ~a()
InBlock.gif                {
InBlock.gif                        Dispose( false);
InBlock.gif                }
InBlock.gif
InBlock.gifIDisposable 成员 #region IDisposable 成员
InBlock.gif
InBlock.gif                 public void Dispose()
InBlock.gif                {
InBlock.gif                        Dispose( true);
InBlock.gif                        GC.SuppressFinalize( this);
InBlock.gif                }
InBlock.gif
InBlock.gif                #endregion
InBlock.gif
InBlock.gif                 protected virtual void Dispose( bool disposing)
InBlock.gif                {
InBlock.gif                         if (!disposed)
InBlock.gif                        {
InBlock.gif                                 if (disposing)
InBlock.gif                                {
InBlock.gif
InBlock.gif                                }
InBlock.gif                                disposed = true;
InBlock.gif                        }
InBlock.gif                }
InBlock.gif
InBlock.gif                 public void f()
InBlock.gif                {
InBlock.gif                         if (disposed)
InBlock.gif                                 throw new ObjectDisposedException( "this");
InBlock.gif                }
InBlock.gif
InBlock.gif                 public void Close()
InBlock.gif                {
InBlock.gif                        Dispose();
InBlock.gif                }
InBlock.gif    
InBlock.gif        }
InBlock.gif
InBlock.gif         class b : a
InBlock.gif        {
InBlock.gif                 bool disposed;
InBlock.gif
InBlock.gif                ~b()
InBlock.gif                {
InBlock.gif                        Dispose( false);
InBlock.gif                }
InBlock.gif
InBlock.gif                 protected override void Dispose( bool disposing)
InBlock.gif                {
InBlock.gif                         try
InBlock.gif                        {
InBlock.gif                                 if (!disposed)
InBlock.gif                                {
InBlock.gif                                         if (disposing)
InBlock.gif                                        {
InBlock.gif
InBlock.gif                                        }
InBlock.gif                                        disposed = true;
InBlock.gif                                }
InBlock.gif                        }
InBlock.gif                         finally
InBlock.gif                        {
InBlock.gif                                 base.Dispose(disposing);
InBlock.gif                        }
InBlock.gif                }
InBlock.gif        }
 
重点:
用户主动释放需释放托管+非托管资源,且通知 GC 垃圾收走了,别来收了
 
析构释放仅回收非托管资源
 
功能实现需考察对象是否释放
 
使用语境下 close 或许是个更好的名字
 
传播该模式到派生类