【发布时间】:2018-03-23 08:32:35
【问题描述】:
Microsoft design guidelines提到Dispose模式和场景如何使用:
务必对包含实例的类型实施基本处置模式 一次性类型。有关详细信息,请参阅基本处置模式部分 关于基本模式。
稍后,他们将基本 Dispose 模式显示如下:
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();
}
}
}
我的问题是:
- 如果 Dispose(bool) 只有一个参数为 true 的调用,为什么我们需要实现它?它可以很容易地简化为无参数的
Dispose() {resource?.Dispose();}。请注意,我们在这里不需要终结器,因为我们引用的对象是托管的并且有自己的终结器,因此它们不会被泄露。 - 为什么他们建议在没有终结器的情况下致电
GC.SuppressFinalize(this)? GC 无论如何都不会调用终结器,因为它不存在! - 我看到需要 Dispose(bool) 的唯一情况是当我们确实有一些非托管引用时,它既不实现 IDisposable 也不实现终结器(如 this article 中所示)。但是
bool disposing的含义将是bool includingManagedResources。那么,为什么它被命名为“处置”它实际上应该做的事情如此误导?
【问题讨论】:
-
你没有。微软担心这些事情,因为他们编写了具有终结器的类。永远不要编写自己的终结器。微软也花了一段时间才发现这一点,然后他们创建了 SafeHandle 类。
-
这种模式背后的原因是可以从您的类继承,并且该继承的类可能具有终结器。不 - 你不需要这样做。
-
@Evk 这实际上是有道理的......谢谢!
标签: c# .net garbage-collection dispose