12

フレームワーク設計ガイドライン (第 2 版、327 ページ) には次のように書かれています。

close がその地域の標準用語である場合はClose()、 に加えてmethod を提供することを検討してください。Dispose()

その際、Close の実装を同一にし、メソッドを明示的にDispose実装することを検討することが重要です。IDisposable.Dispose

したがって、提供された例に従って、次のクラスを取得しました。

public class SomeClass : IDisposable {
    private SomeDisposable someInnerDisposable;

    public void Open() {
        this.someInnerDisposable = new SomeDisposable();
    }

    void IDisposable.Dispose() {
        this.Close();
    }

    public void Close() {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing) {
        if (disposing) {
            this.someInnerDisposable.Dispose();
            this.someInnerDisposable = null;
        }
    }
}

FxCop はそれを好まないようです:

CA1816 : Microsoft.Usage: 'SomeClass.Close()' は、'GC.SuppressFinalize(object)' を呼び出します。このメソッドは、通常、'IDisposable.Dispose' の実装内でのみ呼び出されます。詳細については、IDisposable パターンを参照してください。

CA1816 : Microsoft.Usage: 'SomeClass.IDisposable.Dispose()' を変更して、'GC.SuppressFinalize(object)' を呼び出します。これにより、オブジェクトが破棄されてスコープから外れると、オブジェクトの不要なファイナライズが防止されます。

CA1063 : Microsoft.Design : Dispose(true) を呼び出すように 'SomeClass.IDisposable.Dispose()' を変更し、現在のオブジェクト インスタンス (Visual Basic では 'this' または 'Me') で GC.SuppressFinalize を呼び出してから、戻り値。

CA1063 : Microsoft.Design : 'SomeClass.IDisposable.Dispose()' の名前を 'Dispose' に変更し、パブリックとして宣言され、シールされていることを確認してください。

  • close メソッドを使用して dispose パターンを正しく実装するにはどうすればよいですか?

-また-

  • 警告を抑制するにはどうすればよいですか?

私は試した

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

しかし、FxCop 1.36 はまだそれらを報告します。

編集: 提案されているように変更すると、この警告以外はすべてなくなります:

CA1063 : Microsoft.Design : 'SomeClass.IDisposable.Dispose()' の名前を 'Dispose' に変更し、パブリックとして宣言され、シールされていることを確認してください。

編集 2 : CODE_ANALYSIS は確かにありませんでした。ありがとう。

4

2 に答える 2

15

それを変えてください。

Close() で this.Dispose() を呼び出し、ロジックを Close() メソッドではなく Dispose() メソッドに配置します。

------------------- 編集後の詳細 ---------------

また、宣言を次のように変更します。

public void Dispose()

他のエラーを取り除く必要があります。あなたはそれを次のように宣言しているので:

void IDisposable.Dispose()

パブリックおよびシールとしてマークされておらず、FxCop は不平を言っています。個人的には、エラーを抑制するのではなく、エラーを回避することを好みます。

于 2009-03-10T16:08:58.453 に答える
1

警告を抑制するにはどうすればよいですか?

SuppressMessage() は、条件付きコンパイル シンボルとして CODE_ANALYSIS フラグを指定した場合にのみ機能します。

于 2009-03-10T16:12:22.673 に答える