[英]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.