【发布时间】:2013-09-29 00:39:52
【问题描述】:
关于处置非托管资源的“标准完整”IDisposable 实现有很多信息 - 但实际上这种情况(非常)罕见(大多数资源已经被托管类包装)。这个问题的重点是 IDisposable 的最小实现,用于更常见的“仅托管资源”情况。
1:下面代码中IDisposable的最小实现是否正确,有问题吗?
2:是否有任何理由添加完整的标准IDisposable 实现(Dispose()、Dispose(bool)、Finalizer 等)而不是提供的最小实现?
3:在这种最小情况下,将Dispose 设为虚拟是否可行/明智(因为我们不提供Dispose(bool))?
4:如果这个最小实现被包含(在这种情况下无用的)终结器的完整标准实现替换 - 这会改变 GC 处理对象的方式吗?有什么缺点吗?
5:该示例包括 Timer 和事件处理程序,因为这些情况特别重要,不要错过,因为未能处理它们将使对象保持活动状态(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: When do I need to manage managed resources
SO: How to dispose managed resource in Dispose() method in C#
SO: Dispose() for cleaning up managed resources
【问题讨论】:
-
是 1) 和 1)。当然看起来你已经知道了。
-
@HansPassant 我已经改写了这个问题。您的意见将不胜感激。
标签: c# dispose idisposable