繁体   English   中英

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

[英]Code Analysis finds CA2213 error in designer code

当我在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();

            }
        }

我不再收到警告了。

我总是发现设计者将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仍然是一种很好的做法。但奇怪的是,为什么不存在那些代码行呢?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM