gpt4 book ai didi

c# - 关于 C# Dispose Pattern 的具体问题

转载 作者:太空狗 更新时间:2023-10-29 18:11:24 25 4
gpt4 key购买 nike

我有几个关于 C# 中 Dispose 模式的基本问题。

在下面的代码片段中,这似乎是实现处置模式的标准方式,您会注意到如果处置为 false,则不会处理托管资源。如何/何时处理它们? GC 会出现并稍后处理托管资源吗?但如果是这样的话,GG.SuppressFinalize(this) 调用会做什么?有人可以给我一个处理托管资源的例子吗?脱钩事件浮现在脑海中。还要别的吗?按照模式的编写方式,如果您在“if(处理)”部分什么都不做,它们似乎会(稍后)被处理掉。评论?

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 作为一个示例)谢谢,戴夫

最佳答案

这种实现 IDisposable 模式的方式是一种故障安全方式:万一客户端忘记调用 Dispose,运行时调用的终结器将调用 Dispose(false) 稍后(请注意,您的示例中缺少此部分)。

在后一种情况下,即当 Dispose 被终结器调用时,托管资源将已经被清理,否则相关对象将没有资格进行垃圾回收。

But if that’s the case, what does the GC.SuppressFinalize(this) call do?

运行终结器会带来额外的成本。因此,应尽可能避免。调用 GC.SuppressFinalize(this) 将跳过运行终结器,因此可以更有效地对对象进行垃圾回收。

一般来说,应该避免依赖终结器,因为无法保证终结器会运行。 Raymond Chen 在以下帖子中描述了终结器的一些问题:

When do I need to use GC.KeepAlive?

关于c# - 关于 C# Dispose Pattern 的具体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3805011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com