1

アプリの散発的なクラッシュを調査していますが、何が原因なのかまだわかりません。VB 6.0 またはおそらく VC 6.0 Text コントロール (Interop としての C# のラッパー) を含む MDI フォームを閉じたいときに時々発生します。コードを見ていると、次のようなコードがあることに気付きました。

 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(); 行が2回繰り返されますか?どう思いますか?これが問題になる可能性はありますか?

4

4 に答える 4

6

DisposeIDisposableインターフェイスのドキュメントには、具体的に次のように記載されています。

オブジェクトのDisposeメソッドが複数回呼び出された場合、オブジェクトは最初の呼び出し以降のすべての呼び出しを無視する必要があります。Disposeメソッドが複数回呼び出された場合、オブジェクトは例外をスローしてはなりません。Dispose以外のインスタンスメソッドは、リソースがすでに破棄されている場合にObjectDisposedExceptionをスローする可能性があります。

オブジェクトがIDisposable 適切に実装されている場合、これは問題にはなりません。

そうは言っても、のすべての実装がIDisposable規則に従うわけではありません。Dispose個人的には、オブジェクトにはバグがあり、複数回呼び出すのが問題になる場合は修正する必要があると思います。

于 2012-11-20T19:55:41.047 に答える
2

オブジェクトに対してDispose()を複数回呼び出すと、クラッシュする可能性がありますか?

はい。

オブジェクトに対してDispose()を複数回呼び出すと、常にクラッシュが発生しますか?

いいえ。

基本的に、それは完全に実装に依存します。オブジェクトが実装するという事実は、IDisposable単にそれがDisposeメソッドを持っていることを意味します。それをどのように実装すべきかについては多くのガイドラインがありますが、絶対的なルールは事実上ありません。

だから今私たちは尋ねます:

Disposeオブジェクトに対する複数の呼び出しがIDisposable例外をスローしたり、クラッシュを引き起こしたり、その他の方法で何かを壊したりしないようにすることは良い習慣と考えられていますか?

はい。

誰もが実際にそのガイドラインに従っていますか?

いいえ。

それは実際にここでの私の問題ですか?

*肩をすくめる*言うのは難しいです。そのオブジェクトが具体的にどのように実装されているかはわかりませんDispose

于 2012-11-20T19:55:01.550 に答える
1

BDOTA、

通常、アプリケーションがクラッシュすることはありませんが、moTextEditor の Dispose() メソッドが何をしているのかを考慮する必要があります。

于 2012-11-20T20:08:13.970 に答える