closeメソッドを使用して廃棄パターンを正しく実装する方法(CA1063)
質問
フレームワーク設計ガイドライン(第2版、327ページ)の発言:
CONSIDERがメソッド
Close()
を提供し、Dispose()
に加えて、その地域の標準用語がcloseの場合。その場合、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()'は、通常 'IDisposable.Dispose'の実装内でのみ呼び出されるメソッドである 'GC.SuppressFinalize(object)'を呼び出します。詳細については、IDisposableパターンを参照してください。
CA1816:Microsoft.Usage:「SomeClass.IDisposable.Dispose()」を変更して「GC.SuppressFinalize(object)」を呼び出します。これにより、オブジェクトが破棄されて範囲外になった場合に、オブジェクトの不要なファイナライズが防止されます。
CA 、そして戻る。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は確かに欠落していました。ありがとう。
解決
変更します。
Close()がthis.Dispose()を呼び出し、Close()メソッドの代わりにDispose()メソッドにロジックを配置します。
-------------------編集後の詳細情報---------------
また、宣言を次のように変更します:
public void Dispose()
他のエラーを取り除く必要があります。次のように宣言しているので:
void IDisposable.Dispose()
公開マークが付いておらず、封印されていません。個人的には、エラーを抑制するのではなく、回避することを好みます。
他のヒント
警告を抑制するにはどうすればよいですか
SuppressMessage()は、CODE_ANALYSISフラグを条件付きコンパイルシンボルとして指定した場合にのみ機能します。