代码分析在设计器代码中发现CA2213错误

时间:2013-04-28 07:27:27

标签: c# winforms code-analysis

当我在c#winforms应用程序上运行Code Analysis时,我收到以下警告;

  

应该处理CA2213一次性字段'LogEntryForm'包含IDisposable类型的字段'LogEntryForm._changeValuesNavigator':'DynamicBindingNavigator'。更改'LogEntryForm'上的Dispose方法以在此字段上调用Dispose或Close。 UI LogEntryForm.Designer.cs 15

有问题的代码是

  partial class LogEntryForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

如何阻止设计人员创建无法进行代码分析的代码?

更新: 我尝试将Dispose移动到表单代码

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

    private void Dispose(bool disposing)
    {
        if (disposing)
        {


            //makes sure no outside object has a reference
            //to the event - thus keeping it alive when it should be garbagecollected


             if (_changeOperationsNavigator != null) _changeOperationsNavigator.Dispose();
             if (_changeValuesNavigator != null) _changeValuesNavigator.Dispose();


        }
    }

但现在代码分析抱怨

  

应该处理CA2213一次性字段'LogEntryForm'包含IDisposable类型的字段'LogEntryForm.components':'IContainer'。更改'LogEntryForm'上的Dispose方法以在此字段上调用Dispose或Close。 UI LogEntryForm.cs 214

[更新]在研究了Mathew的答案后,我将表单更改为只有一个Dispose方法

  private void Dispose(bool disposing)
        {
            if (disposing)
            {
                 if (_changeOperationsNavigator != null) _changeOperationsNavigator.Dispose();
                 if (_changeValuesNavigator != null) _changeValuesNavigator.Dispose();
                 if (components != null)
                     components.Dispose();

            }
        }

我不再收到警告。

1 个答案:

答案 0 :(得分:4)

我总觉得设计人员将Dispose()方法放入“Designer.cs”文件中会让人感到厌烦。如果您查看生成的代码,您会看到{<1}}方法放在之前区域

Dispose()

每当我想要更改#region Windows Form Designer generated code 时,我总是将它从“Designer.cs”文件移到主“.cs”文件中,因为我不喜欢在“.cs”文件中使用手动编写的方法Designer.cs“文件。

鉴于警告似乎是真实的,我会在你的情况下做同样的事情。将“Dispose()”方法移动到主“.cs”文件中,然后处理CA抱怨的内容或(如果您确定没问题)禁止警告。

我不知道如何解决原始问题(设计人员生成的代码没有处理相关对象) - 但设计师从不似乎触及了{{1}在任何情况下(除了第一次生成时),所以我想自己修复它是唯一的选择。

[编辑]

我还注意到你的dispose方法似乎缺少一些通常自动生成的样板代码。

通常,Dispose()应如下所示:

Dispose()

(以及您自己添加的任何代码。)

您可以添加该代码并查看会发生什么吗?请注意Dispose()如何匹配错误消息中提到的字段的名称。我认为你的应该是这样的:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

(如果修改它,将Dispose()方法移出Designer.cs仍然是一个好习惯。但奇怪的是,为什么那些代码行不在那里?)