关于处置非托管资源的“标准完整”实现有很多信息IDisposable
- 但实际上这种情况(非常)罕见(大多数资源已经被托管类包装)。这个问题的重点是 IDisposable 的最小实现,用于更常见的“仅托管资源”情况。
1:下面代码中的最小实现IDisposable
是否正确,有问题吗?
2:是否有任何理由在提供的最小 实现上添加完整的标准IDisposable
实现(Dispose()
、Dispose(bool)
等)?Finalizer
3:在这个最小的情况下制作Dispose
虚拟(因为我们不提供Dispose(bool)
)是否可以/明智?
4:如果这个最小实现被包含(在这种情况下无用的)终结器的完整标准实现替换 - 这会改变 GC 处理对象的方式吗?有什么缺点吗?
5:示例包括Timer
和事件处理程序,因为这些情况特别重要,不要错过,因为未能释放它们将使对象保持活动状态(this
在 的情况下Timer
,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() 用于清理托管资源