-1

例外をスローせず.Disposeに同じインスタンスを複数回呼び出すことは可能ですか? IDisposableこれには何らかの定義がありますか?

例えば:

public class Test : IDisposable
{
    public void Dispose()
    {
        // What ever
    }
}

var t = Test();
t.Dispose();
t.Dispose(); // Should this work in any case?

私がこれを求めている理由:

VisualTreeから継承する for 要素を検索するメカニズムをいくつか作成しましたIDisposableが、これらの要素のいずれかが前に破棄されるかどうかはわかりません。

ウィンドウクラスから切り出されたいくつかのコード

/// <summary>
/// Dispose
/// </summary>
public void DisposeAll()
{
    foreach (var obj in WPFVisualTreeHelper.FindChildren<IDisposable>(this))
    {
        if (!disposables.Contains(obj))
        {
            disposables.Add(obj);
        }
    }
    foreach (IDisposable disposable in disposables)
    {
        disposable.Dispose();
    }
}

ありがとうございました!

4

2 に答える 2

1

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

ソース

于 2016-04-21T08:51:37.543 に答える
1

MSDNは次のように述べています。

Dispose メソッドが複数回呼び出された場合、オブジェクトは例外をスローしてはなりません。Dispose 以外のインスタンス メソッドは、リソースが既に破棄されている場合に ObjectDisposedException をスローできます。

最後の部分も重要です。ブール値フラグを設定して、が呼び出さdisposedれた後にリソースが使用されないようにしてください。Dispose2 番目の呼び出しでそれを使用して、Disposeそれを無視することもできます。

于 2016-04-21T08:52:09.320 に答える