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