現在、分析中のコードでCA2202 (オブジェクトを複数回破棄しないでください) を取得しています。HttpApplication.Dispose
警告は、私がオーバーライドしているメソッドを指しています。IDispose.Dipose
メソッドを仮想にしたり、オーバーライドしたりしてはならないことはわかっていますが、これは Microsoft がクラスでIDispose.Dispose
仮想として実装しHttpApplication
、仮想保護された Dispose メソッドを提供していないためです。
base.Dispose
警告は、メソッドの呼び出しについて不平を言っているようです。基本クラスがオブジェクトを閉じるか破棄する必要がある場合に備えて、基本の Dispose メソッドを呼び出しています。また、それ以外の場合は、おそらくCA2215 ( Dispose メソッドは基本クラスの dispose を呼び出す必要があります) 警告が表示されるのではないかと思います。
この (CA2202) 警告が表示される理由とその対処方法を知っている人はいますか?
私はそれを抑制したくなりますが、MSDN のドキュメントには、決して抑制すべきではないと書かれています。
サブクラスは次のようになります (簡潔にするために短縮されており、_container
フィールドが初期化されていると想定できます)。
public class MyHttpApplication : HttpApplication
{
private bool _disposed;
private IDisposable _container;
public sealed override void Dispose()
{
if (_disposed)
return;
try
{
Dispose(true);
GC.SuppressFinalize(this);
}
finally
{
//The following lines is what causes the CA2202 code analysis warning
base.Dispose();
}
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
try
{
if (disposing && _container != null)
{
_container.Dispose();
}
}
finally
{
_disposed = true;
}
}
}