【问题标题】:CA2202 CA2215 HttpApplication Dispose base callCA2202 CA2215 HttpApplication Dispose 基本调用
【发布时间】:2015-05-14 11:33:54
【问题描述】:

我目前正在分析的代码中收到CA2202不要多次处理对象)。警告指的是我正在覆盖的HttpApplication.Dispose 方法。我知道IDispose.Dipose 方法不应该是虚拟的或被覆盖,但这是因为微软在HttpApplication 类中将IDispose.Dispose 实现为虚拟并且没有提供虚拟的受保护的Dispose 方法。

警告似乎是在抱怨base.Dispose 方法的调用。如果基类需要关闭或处置任何对象,我将调用基 Dispose 方法。并且还怀疑我最终可能会收到CA2215Dispose 方法应该调用基类 dispose)警告。

有谁知道我为什么收到此 (CA2202) 警告以及如何处理?

我很想压制它,但MSDN docs 说永远不应该压制它。

子类如下所示(为简洁起见,已将其缩短,您可以假设 _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;
        }
    }   
}

【问题讨论】:

    标签: c# dispose httpapplication ca2202


    【解决方案1】:

    似乎不压制某些东西是没有出路的。我的解决方案是将对 base.Dispose() 的调用放在 Dispose(bool) 方法中,然后抑制 CA2215,MSDN docs 对此表示“如果对 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多