0

我陷入了如何IDisposableGarbageCollector工作的杂草中。

假设您有一个IDisposable对象,它实际上并没有它所持有的资源(但该Dispose()方法在调用时会做一些事情)。并假设您在块的头部声明它using,但实际上并没有在块的过程中与对象交互。

我对GarbageCollection将如何运作有什么保证?

IE

using(new MyConceptuallyDisposableObject())
{
   DoSomeWork();
   await DoSomeAsyncWork();
}//PointX

注意:

  • MyConceptuallyDisposableObject 没有声明终结器/析构函数。
    • (假设开发人员永远不会忘记using`.Dispose()` 我的对象)
  • MyConceptuallyDisposableObject 不会GC.SuppressFinalise(this)在任何地方调用。

我是否保证object我构建的将:

  1. 以前不会.Dispose()叫过吧PointX
  2. 究竟会不会叫它.Dispose()呢? PointX
  3. 之前的任何时候都不会得到GarbageCollected/Finalized吗? PointX
  4. 在它调用它之前不会得到GarbageCollected/Finalized吗?.Dispose()

假设我然后更改我的代码以在其构造函数中进行MyConceptuallyDisposableObject调用。GC.SuppressFinalise(this)(请记住,没有任何析构函数或终结器)

  1. 这会改变上述具体问题的任何答案吗?
  2. 那么一般情况有什么变化吗?
  3. 这是否意味着GC永远不会清理我的对象并且我最终会出现内存泄漏?

*语境:*

为那些不可避免地好奇的人发布,但不要回答基于建议其他方法来实现这一点或我不应该这样做。现在,我更专注于从抽象意义上理解上述概念的内涵,而不是讨论我最初的尝试是否明智。

我想写一个DisposableAction()接受 2 Actions 的类。一种在您构建时执行,另一种在您构建时执行Dispose()

我以为我知道上述所有问题的答案(并且它们是“是”、“是”、“是”、“是”、“否”、“几乎没有,除非你对性能非常敏感”和“不”。),但我一直在尝试诊断一个似乎与这些信念相矛盾的错误。

4

1 回答 1

0

IDisposable和垃圾回收是无关的,除了对象实现一个碰巧调用.Dispose()的终结器的情况。

除非您确定 100% 明确地知道一个对象有一个调用的终结器,.Dispose()否则您必须.Dispose()显式调用(或使用 a using以确保对象被释放。

您的问题的答案:

  1. 是的。
  2. 是的。
  3. 是的。
  4. 是的。
  5. 不。
  6. 不。
  7. 不。
于 2020-07-22T12:20:08.927 回答