最近,我正在研究一些关于未处理对象的棘手错误。
我在代码中发现了一些模式。据报道,一些 m_foo 没有被释放,而 SomeClass 的所有实例似乎都被释放了。
public class SomeClass: IDisposable
{
void Dispose()
{
if (m_foo != null)
{
m_foo.Dispose();
}
if (m_bar != null)
{
m_bar.Dispose();
}
}
private Foo m_foo;
private Bar m_bar;
}
我怀疑 Foo.Dispose 可能会引发异常,因此不会执行以下代码,因此不会释放 m_bar。
由于 Foo/Bar 可能来自第三方,因此不能保证不抛出异常。
如果只是用 try-catch 包装所有 Dispose 调用,代码将变得笨拙。
处理这个问题的最佳做法是什么?