<分区>
我知道实现 dispose pattern 的一般准则警告不要实现虚拟 Dispose()
。然而,大多数情况下,我们只使用类中的托管资源,因此完整的处置模式似乎有点矫枉过正——即我们不需要终结器。在这种情况下,是否可以在基类中使用虚拟 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
类中,这个示例就会出现问题。但假设这不会发生。上面的例子是有效/安全/稳健的,还是会造成任何问题?我是否应该坚持标准的成熟处理模式,即使没有使用非托管资源?或者在这种情况下,上述方法确实完全可行 - 根据我的经验,这比处理非托管资源要普遍得多?