【问题标题】:fxcop CA2213 error in vs2010vs2010 中的 fxcop CA2213 错误
【发布时间】:2010-10-12 12:06:53
【问题描述】:

我有以下代码: 包含两个一次性成员的一次性类。 其中一个是使用 new() 方法初始化的,另一个是使用静态工厂方法。 我也有静态代码分析规则,CA2213为错误。

    public class DisposableClass : IDisposable
{
    private WebClient m_DisposableMember1;

    public WebClient DisposableMember1
    {
        get
        {
            if (m_DisposableMember1 == null)
            {
                m_DisposableMember1 = new WebClient();
            }
            return m_DisposableMember1;
        }
    }

    private WebClient m_DisposableMember2;

    public WebClient DisposableMember2
    {
        get
        {
            if (m_DisposableMember2 == null)
            {
                m_DisposableMember2 = Factory.Create();
            }
            return m_DisposableMember2;
        }
    }


    #region Finalize/Dispose Pattern
    private bool m_IsDisposed = false;

    //Implement IDisposable.
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~DisposableClass()
    {
        Dispose(false);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!m_IsDisposed)
        {
            if (disposing)
            {
                DisposableMember1.Dispose();
                // DisposableMember2 in not disposed and not notified by fxCop
            }

            m_IsDisposed = true;
        }
    }
    #endregion Finalize/Dispose Pattern

}

这是简单的工厂类:

    public static class Factory
{
    public static WebClient Create()
    {
        return new WebClient();
    }
}

当我调用 DisposableMember1 属性的 Dispose() 方法时,我得到 CA2213。 当我调用 m_DisposableMember1 成员的 Dispose() 方法时,我没有收到此错误。

此外,我没有收到 m_DisposableMember2 的这个错误(Wich 是使用静态工厂初始化的),并且它没有被释放。

有人熟悉这个问题吗?什么会导致这种行为?

【问题讨论】:

    标签: c# visual-studio-2010 fxcop


    【解决方案1】:

    CA2213 在识别应该被处理的字段方面并不是特别积极。除其他潜在问题外,它仅考虑从构造函数调用直接分配的字段。通过属性或从构造函数调用以外的源分配字段值不会导致目标字段被包含在规则的“应该处置”字段池中。

    【讨论】:

      【解决方案2】:

      您对这个工具的智能期望有点过高。该属性是该字段的别名,这仅对人眼是显而易见的。它需要非常复杂的分析才能让工具看到。 FxCop 只是没有那种马力。您的代码实际上是有问题的。如果客户端代码从未使用过该属性,那么您将创建 WebClient 对象并立即释放它。改用该字段,测试 null 和 Dispose()。

      第二个字段的问题可能是由于需要该工具来避免不必要的警告。只有当它可以绝对肯定地确定该字段是否已初始化时,它才会抱怨。这里同样缺乏智慧,它不能说工厂总是返回一个非空引用。只有看到类本身使用了构造函数,才能确定该字段需要被释放。

      这是一个很好的工具,并不完美。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 2016-04-09
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多