我陷入了如何IDisposable
和GarbageCollector
工作的杂草中。
假设您有一个IDisposable
对象,它实际上并没有它所持有的资源(但该Dispose()
方法在调用时会做一些事情)。并假设您在块的头部声明它using
,但实际上并没有在块的过程中与对象交互。
我对GarbageCollection
将如何运作有什么保证?
IE
using(new MyConceptuallyDisposableObject())
{
DoSomeWork();
await DoSomeAsyncWork();
}//PointX
注意:
- MyConceptuallyDisposableObject 没有声明终结器/析构函数。
- (假设开发人员永远不会忘记
using
`.Dispose()` 我的对象)
- (假设开发人员永远不会忘记
- MyConceptuallyDisposableObject 不会
GC.SuppressFinalise(this)
在任何地方调用。
我是否保证object
我构建的将:
- 以前不会
.Dispose()
叫过吧PointX
? - 究竟会不会叫它
.Dispose()
呢?PointX
- 之前的任何时候都不会得到GarbageCollected/Finalized吗?
PointX
- 在它调用它之前不会得到GarbageCollected/Finalized吗?
.Dispose()
假设我然后更改我的代码以在其构造函数中进行MyConceptuallyDisposableObject
调用。GC.SuppressFinalise(this)
(请记住,没有任何析构函数或终结器)
- 这会改变上述具体问题的任何答案吗?
- 那么一般情况有什么变化吗?
- 这是否意味着
GC
永远不会清理我的对象并且我最终会出现内存泄漏?
*语境:*
为那些不可避免地好奇的人发布,但请不要回答基于建议其他方法来实现这一点或我不应该这样做。现在,我更专注于从抽象意义上理解上述概念的内涵,而不是讨论我最初的尝试是否明智。
我想写一个DisposableAction()
接受 2 Action
s 的类。一种在您构建时执行,另一种在您构建时执行Dispose()
。
我以为我知道上述所有问题的答案(并且它们是“是”、“是”、“是”、“是”、“否”、“几乎没有,除非你对性能非常敏感”和“不”。),但我一直在尝试诊断一个似乎与这些信念相矛盾的错误。