我有一个父类和子类都需要实现IDisposable
。应该在哪里virtual
(and 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);
}
}
当我只是重写 Dispose(bool dispose) 调用时,感觉非常奇怪,因为我实现了 IDisposable 而没有显式的 Dispose() 函数(仅利用继承的函数),但拥有其他一切。
这是你不应该关心的事情。
当您对 IDisposable 类进行子类化时,基类已经为您处理了所有“Dispose 模式”管道。你真的应该什么都不做,除了覆盖protected Dispose(bool)
方法,并跟踪您是否已经被处置(以正确地提出ObjectDisposedException
.)
有关详细信息,请参阅我的博客文章从 IDisposable 类派生子类 http://reedcopsey.com/2009/03/30/idisposable-part-2-subclass-from-an-idisposable-class/.
此外,通常最好考虑封装 IDisposable 类而不是对其进行子类化。有时,对 IDisposable 类进行子类化是合适的,但这种情况很少见。封装通常是更好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)