我有一个父类和一个子类,它们都需要实现 IDisposable
接口。那么在哪里应该使用 virtual
关键字(以及 base.Dispose()
)呢?当我仅重写 Dispose(bool disposing)
方法时,感觉很奇怪,因为我声明了自己实现了 IDisposable
接口,但没有明确的 Dispose()
函数(只是利用了继承下来的函数),而其他方法则完全实现了。
我的做法(大大简化):
internal class FooBase : IDisposable
{
Socket baseSocket;
private void SendNormalShutdown() { }
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private bool _disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
SendNormalShutdown();
}
baseSocket.Close();
}
}
~FooBase()
{
Dispose(false);
}
}
internal class Foo : FooBase, IDisposable
{
Socket extraSocket;
private bool _disposed = false;
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
extraSocket.Close();
}
base.Dispose(disposing);
}
~Foo()
{
Dispose(false);
}
}