【问题标题】:Code Analysis finds CA2213 error in designer code代码分析在设计器代码中发现 CA2213 错误
【发布时间】:2013-12-21 01:18:54
【问题描述】:

当我在我的 c# winforms 应用程序上运行代码分析时,我收到以下警告;

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();

            }
        }

我不再收到警告。

【问题讨论】:

  • 我认为您不能“阻止设计人员创建代码分析失败的代码”。充其量,您可以将 CA2213 从应用于您的代码的规则列表中排除 - 如果您的团队有足够的信心这样做:-)

标签: c# winforms code-analysis


【解决方案1】:

我总是觉得设计者将Dispose() 方法放入“Designer.cs”文件中很烦人。如果您查看生成的代码,您会看到 Dispose() 方法放置在 表示

的区域之前
#region Windows Form Designer generated code

每当我想更改Dispose() 时,我总是将其从“Designer.cs”文件移到主“.cs”文件中,因为我不喜欢在“Designer.cs”中手动编写方法。 cs”文件。

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

我不知道如何解决最初的问题(设计者生成的代码没有处理有问题的对象) - 但设计者 从不 似乎触及Dispose() in任何情况下(第一次生成时除外),所以我想自己修复它是唯一的选择。

[编辑]

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

通常,Dispose() 应该是这样的:

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

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

你能把这段代码加进去看看会发生什么吗?请注意components 如何匹配错误消息中提到的字段名称。因此,我认为您的应该如下所示:

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();

        if (components != null)
            components.Dispose();
    }
}

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

【讨论】:

  • 谢谢。当我尝试将代码移动到表单时,我更新了我的问题
  • 我得到一个错误成员已经声明了相同的签名名称。错误 2 类型“SBD.Syrius.UI.Logs.LogEntryForm”已经定义了一个名为“Dispose”的成员,具有相同的参数类型 LogEntryForm.cs
  • @kirsteng 对不起,我不够清楚:我的意思是你用我给出的第二个例子替换整个 Dispose() - 但幸运的是你把它弄明白了。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多