我知道实现dispose pattern的通用指南警告不要实现虚拟Dispose()
。然而,我们大多数情况下只在类内部处理托管资源,因此完整的dispose模式似乎有些过度 - 也就是说,我们不需要一个finalizer。在这种情况下,在基类中有一个虚拟的Dispose()
是否可以呢?
考虑这个简单的例子:
abstract class Base : IDisposable
{
private bool disposed = false;
public SecureString Password { get; set; } // SecureString implements IDisposable.
public virtual void Dispose()
{
if (disposed)
return;
if (Password != null)
Password.Dispose();
disposed = true;
}
}
class Sub : Base
{
private bool disposed = false;
public NetworkStream NStream { get; set; } // NetworkStream implements IDisposable.
public override void Dispose()
{
if (disposed)
return;
if (NStream != null)
NStream.Dispose();
disposed = true;
base.Dispose();
}
}
我认为这种方法比完整的清理模式更容易理解。我明白如果我们将非托管资源引入
Base
类中,那么这个例子可能会变得棘手。但是假设这不会发生,那么上面的例子是否有效/安全/健壮,或者它会带来任何问题?即使没有使用非托管资源,我是否应该坚持使用标准的完整清理模式?还是上述方法在这种情况下确实是完全可以的 - 在我的经验中,这种情况比处理非托管资源要常见得多?