CA2202 CA2215 HttpApplication Утилизировать базовый вызов

В настоящее время я получаю 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;
        }
    }   
}

1 ответ

Кажется, нет выхода без подавления чего-либо. Мое решение состояло в том, чтобы поместить вызов base.Dispose() в метод Dispose(bool), а затем подавить CA2215, для чего документы MSDN говорят: "Безопасно подавить предупреждение из этого правила, если вызов base.ispose происходит в более глубокий уровень вызова, чем проверка правил ".

[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;
    }
}
Другие вопросы по тегам