【发布时间】:2011-04-17 19:52:44
【问题描述】:
我有几个关于 C# 中的 Dispose 模式的基本问题。
在下面的代码 sn-p 中,这似乎是实现 dispose 模式的标准方式,您会注意到如果 disposing 为 false,则不会处理托管资源。如何/何时处理它们? GC 是否会出现并稍后处理托管资源?但如果是这样,GG.SuppressFinalize(this) 调用会做什么?有人可以给我一个处置托管资源的例子吗?解开事件浮现在脑海中。还要别的吗?模式的编写方式,如果你在“if(disposing)”部分什么都不做,它们似乎会被(稍后)处理掉。评论?
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Dispose managed resources.
}
// There are no unmanaged resources to release, but
// if we add them, they need to be released here.
}
disposed = true;
// If it is available, make the call to the
// base class's Dispose(Boolean) method
base.Dispose(disposing);
}
// implements IDisposable
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
我在这个线程How do I implement the dispose pattern in c# when wrapping an Interop COM Object? 中读到的关于 Dispose(bool) 中的锁的内容是真的吗?它说,“元元注释——除此之外,在非托管清理期间永远不要获取锁或使用锁,这一点很重要。”这是为什么?它也适用于非托管资源吗?
最后,是否曾经在不实现 IDisposable 的情况下实现终结器(C# 中的 ~MyClass())?我相信我在某处读到,如果没有非托管资源,终结器和 IDisposable 就不是必需的(或可取的)。但是,我确实看到在某些示例中使用了没有 IDisposable 的终结器(请参阅:http://www.codeproject.com/KB/cs/idisposable.aspx 作为一个示例) 谢谢, 戴夫
【问题讨论】:
-
感谢大家的所有好评!不幸的是,我只能将一个标记为答案。
标签: c# dispose idisposable