フレームワーク設計ガイドライン (第 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 は確かにありませんでした。ありがとう。