CA2202 CA2215 Базовый вызов HttpApplication Dispose

В настоящее время я получаю CA2202 (Не удалять объекты, раз) в коде, который я анализирую. Предупреждение относится к методу HttpApplication.Dispose, который я переопределяю. Я знаю, что метод IDispose.Dipose не должен быть виртуальным или переопределяться, но это результат того, что Microsoft реализует IDispose.Dispose как виртуальный в классе HttpApplication и не предоставляет виртуальный защищенный метод Dispose.

Предупреждение, похоже, жалуется на вызов метода base.Dispose. Я вызываю базовый метод Dispose на случай, если базовому классу необходимо закрыть или удалить какие-либо объекты. И также подозреваю, что я, вероятно, закончу с CA2215 (< em>Методы 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;
        }
    }   
}

person Tom Maher    schedule 12.03.2015    source источник


Ответы (1)


Кажется, что нет выхода без подавления чего-то. Мое решение состояло в том, чтобы поместить вызов 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;
    }
}
person Glen Stone    schedule 26.01.2016