0

我目前正在分析的代码上获得CA2202不要多次处理对象)。警告指的HttpApplication.Dispose是我要覆盖的方法。我知道该IDispose.Dipose方法不应该是虚拟的或被覆盖,但这是微软IDispose.Dispose在类中实现 as virtualHttpApplication而没有提供虚拟的受保护的 Dispose 方法的结果。

该警告似乎在抱怨该base.Dispose方法的调用。如果基类需要关闭或处置任何对象,我将调用基 Dispose 方法。并且还怀疑我最终可能会收到 CA2215Dispose 方法应调用基类 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 回答