【发布时间】:2014-07-09 20:47:52
【问题描述】:
参考:http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
在这个 MSDN 示例中,如果在子类中重写了 Dispose(bool),是否会执行该基类中的 Dispose(bool) 代码? IE。 resource.Dispose() 会被调用吗?子类需要调用base.Dispose(true)吗?
public class DisposableResourceHolder : IDisposable {
private SafeHandle resource; // handle to a resource
public DisposableResourceHolder(){
this.resource = ... // allocates the resource
}
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (disposing){
if (resource!= null) resource.Dispose();
}
}
}
【问题讨论】:
-
当然。当你重写一个方法时,你需要调用基类来执行它。
-
这是一个完全错误的非常标准的例子。实现该模式没有意义,该类没有终结器,也没有继承强制重写 Disposable(bool) 的基类。当 disposing 为假时,您总是可以通过无所事事来判断。
-
正如@Hans 所说,这种模式在这里不合适。有些人建议实现该模式,以防派生类拥有非托管资源——这完全是垃圾。派生类可以重新实现
IDisposable,添加终结器,并提供virtual void Dispose(bool disposing) { if (disposing) { base.Dispose(); } }基子对象在许多方面与成员子对象相似,包括在释放完整对象时应调用其Dispose()方法。 -
(但不要在任何非最终类中显式实现
IDisposable.Dispose(),因为这会阻止任何派生类调用base.Dispose()) -
@BenVoigt:使用密封的外部可调用
Dispose方法1 链接到虚拟方法1 的一个优点是它允许在对象静止时插入基类逻辑有效的。例如,如果基类附加了异步事件处理程序,它可以使用sealeddispose 方法安全地禁用它们并等待挂起的调用完成,然后派生类对象开始自行分解。
标签: c# .net idisposable