gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:21:12 29 4
gpt4 key购买 nike

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

CA2213 Disposable fields should be disposed 'LogEntryForm' contains field 'LogEntryForm._changeValuesNavigator' that is of IDisposable type: 'DynamicBindingNavigator'. Change the Dispose method on 'LogEntryForm' to call Dispose or Close on this field. 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 Disposable fields should be disposed 'LogEntryForm' contains field 'LogEntryForm.components' that is of IDisposable type: 'IContainer'. Change the Dispose method on 'LogEntryForm' to call Dispose or Close on this field. 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 仍然是一个好习惯。但是奇怪的是,为什么这些代码行不在那里?)

关于c# - 代码分析在设计器代码中发现 CA2213 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16260654/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com