繁体   English   中英

CA2202 CA2215 HttpApplication处置基调用

[英]CA2202 CA2215 HttpApplication Dispose base call

我目前正在我正在分析的代码上获取CA2202请勿多次放置对象 )。 警告是指我重写的HttpApplication.Dispose方法。 我知道IDispose.Dipose方法不应是虚拟的或被覆盖,但这是Microsoft在HttpApplication类中实现IDispose.Dispose为虚拟的并且没有提供受保护的虚拟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;
        }
    }   
}

似乎没有抑制的办法是没有出路的。 我的解决方案是将对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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM