当我在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();
}
}
我不再收到警告。
答案 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仍然是一个好习惯。但奇怪的是,为什么那些代码行不在那里?)