我有一个实现IDisposable
的对象,我想在Dispose上做一些涉及其他对象的工作。我怎么能确定这项工作已经完成。目前,处理是在if内完成的。我不能在if之外删除它吧?
注意:在MyClass实例死后,_innerObject可能会或可能会继续存在。
private OtherClass _innerObject;
~MyClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
_innerObject.DoSomeJob();
}
_disposed = true;
}
答案 0 :(得分:1)
对innerObject的调用是什么意思?
对于与关机相关的方法,您可以在AppDomain上使用事件(例如,ProcessExit / DomainUnload)。如果您需要清理与MyClass相关的资源,您可以采取您已采取的方法,但无法保证将调用DoSomeJob
。另一种方法是启用代码分析,并在CA2000上失败。
答案 1 :(得分:1)
你无法有这样的保证。 IDisposable
是您可以做的最好的,但它仍然依赖于您的类型的使用者来正确处理所创建的每个实例。如果他们不这样做,那么你就无法真正做到这一点。
答案 2 :(得分:0)
阅读完评论后,我会说你可以保证在MyClass之前没有通过从CriticalFinalizerObject继承OtherClass来最终确定_innerObject。但这似乎是一些黑客攻击