首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CA2202 CA2215 HttpApplication Dispose基调用

CA2202 CA2215 HttpApplication Dispose基调用
EN

Stack Overflow用户
提问于 2015-03-12 10:45:02
回答 1查看 316关注 0票数 0

我目前正在得到我分析的代码上的CA2202 (不要多次释放对象)。警告指的是我正在重写的HttpApplication.Dispose方法。我知道IDispose.Dipose方法不应该是虚拟的或者是过度的,但是这是微软在HttpApplication类中将IDispose.Dispose实现为虚拟的结果,并且没有提供一个虚拟的受保护的Dispose方法。

该警告似乎是在抱怨base.Dispose方法的调用。我正在调用基Dispose方法,以防基类需要关闭或释放任何对象。还怀疑我可能会以CA2215 (Dispose方法应该调用基类dispose)的方式结束,否则会发出警告。

有人知道我为什么要收到这个(CA2202)警告吗?该怎么办?

我很想抑制它,但是MSDN文档说它永远不应该被压制。

子类如下所示(为了简洁起见,它被缩短了,您可以假设_container字段已经初始化):

代码语言:javascript
复制
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;
        }
    }   
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-26 04:43:03

似乎没有办法,除非压制一些东西。我的解决方案是将对base.Dispose()的调用放在Dispose(bool)方法中,然后抑制CA2215,对于该方法,MSDN文档说“如果对base.Dispose的调用发生在比规则检查更深的调用级别,则可以安全地抑制来自该规则的警告”。

代码语言:javascript
复制
[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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29007613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档