0

現在、分析中のコードで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;
        }
    }   
}
4

1 に答える 1

0

何かを抑えないと抜け出せないようです。私の解決策は、base.Dispose() への呼び出しを Dispose(bool) メソッド内に置き、CA2215 を抑制することでした。これについて、MSDN ドキュメントには、「base.Dispose への呼び出しが発生した場合、このルールからの警告を抑制しても安全です」と書かれています。ルール チェックよりも深い呼び出しレベルです。」

[SuppressMessage("Microsoft.Usage", "CA2215:Dispose methods should call base class dispose", Justification = "base.Dispose() is called from Dispose(bool)")]
public sealed override void Dispose()
{
    if (_disposed)
        return;
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (_disposed)
        return;

    try
    {
        if (disposing)
        {
            base.Dispose();
            if (_container != null)
            {
                _container.Dispose();
            }
        }
    }
    finally
    {
        _disposed = true;
    }
}
于 2016-01-26T04:43:03.787 に答える