1

我正在调查我的应用程序中的零星崩溃,但仍然不确定是什么原因造成的。当我想关闭包含 VB 6.0 或 VC 6.0 文本控件的 MDI 表单时,有时会发生这种情况——它作为互操作的 C# 包装器。在查看代码时,我注意到我有一些这样的代码:

 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;
        }
    }

所以注意到moTextEditor.Dispose(); 线路重复两次?你怎么看?这可能是问题吗?

4

4 回答 4

6

DisposeIDisposable 接口文档特别指出:

如果多次调用对象的 Dispose 方法,则对象必须忽略第一次调用之后的所有调用。如果多次调用其 Dispose 方法,则该对象不得引发异常。当资源已被释放时,除 Dispose 之外的实例方法可能会引发 ObjectDisposedException。

如果对象IDisposable 正确实施,这应该不是问题。

话虽如此,并非所有的实现都IDisposable遵循规则。我个人会说该对象有一个错误,如果Dispose多次调用有问题,应该予以纠正。

于 2012-11-20T19:55:41.047 回答
2

重复处理看起来像一个错误,但通常不会导致任何问题。

如果实施得当,一个对象可以被多次处置而不会造成伤害。

于 2012-11-20T19:54:10.807 回答
2

对一个对象多次调用 Dispose() 会导致崩溃吗?

是的。

对一个对象多次调用 Dispose() 是否总是会导致崩溃?

不。

基本上,它完全取决于实现。一个对象实现的事实IDisposable仅仅意味着它有一个Dispose方法。关于如何实施它有很多指导方针,但实际上没有绝对的规则。

所以现在我们问:

确保Dispose对我的IDisposable对象的多次调用不会引发异常、导致崩溃或以其他方式破坏内容是否被认为是一种好习惯?

是的。

每个人都真正遵循该准则吗?

不。

这实际上是我的问题吗?

*耸耸肩*很难说。我们不知道该对象具体是如何实现Dispose的。

于 2012-11-20T19:55:01.550 回答
1

BDotA,

通常它不会使您的应用程序崩溃,但您需要考虑 moTextEditor 的 Dispose() 方法在做什么。

于 2012-11-20T20:08:13.970 回答