4

当我在我的 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

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

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

            }
        }

我不再收到警告。

4

1 回答 1

4

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

#region Windows Form Designer generated code

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

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

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

[编辑]

我还注意到您的 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 仍然是一种很好的做法。奇怪的是为什么这些代码行不在那里?)

于 2013-04-28T08:52:25.687 回答