我正在调查我的应用程序中的零星崩溃,但仍然不确定是什么导致它.当我想要关闭包含VB 6.0或VC 6.0 Text控件的MDI表单时,有时会发生这种情况 - 它的C#包装为Interop.在查看代码时,我注意到我有一些这样的代码:
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing) //Disposing of everything: managed and unmanaged resources.
{
moTextEditor.Dispose(); --here
moTextEditor.Dispose(); --here
}
// Deal with our own & whatever other unmanaged resources (this used to be done in the finalizer, above)
SetLockedFields(false);
disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
所以注意到moTextEditor.Dispose(); 线重复两次?你怎么看?这可能是问题吗?
Dispose的IDisposable接口文档具体说明:
如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.除了Dispose之外的实例方法可以在已经处置资源时抛出ObjectDisposedException.
如果对象IDisposable 正确实现,这应该不是问题.
话虽如此,并非所有实施都IDisposable遵循规则.我个人会说该对象有一个错误,如果Dispose多次调用有问题应该纠正.