有很多关于“标准完整”IDisposable
实现释放非托管资源的信息,但实际上这种情况非常罕见(大多数资源已经由托管类封装)。此问题侧重于针对更常见的“仅托管资源”的最小化实现。
1:以下代码中的的最小实现是否正确,是否存在问题?
2:是否有任何理由添加完整的标准实现(Dispose()
,Dispose(bool)
,Finalizer
等)超过所提供的最小实现?
3:在这种最小情况下,使Dispose
虚拟化是否可以(因为我们没有提供Dispose(bool)
)?
4:如果将这种最小实现替换为包括(在这种情况下无用的)终结器的完整标准实现,这是否会改变GC处理对象的方式?是否存在任何缺点?
5:示例包括Timer
和事件处理程序,因为这些情况特别重要,不容忽视,因为未能处理它们将使对象保持活动状态(在计时器的情况下为this
,在事件处理程序的情况下为eventSource
),直到GC在自己的时间中处理它们。是否还有其他类似的情况?
class A : IDisposable {
private Timer timer;
public A(MyEventSource eventSource) {
eventSource += Handler
}
private void Handler(object source, EventArgs args) { ... }
public virtual void Dispose() {
timer.Dispose();
if (eventSource != null)
eventSource -= Handler;
}
}
class B : A, IDisposable {
private TcpClient tpcClient;
public override void Dispose() {
(tcpClient as IDispose).Dispose();
base.Dispose();
}
}
参考资料:
MSDN
SO: 当我需要管理托管资源时
SO: 如何在C#中的Dispose()方法中处理托管资源
SO: Dispose()用于清理托管资源