protected override void SetValueFromControl()
{
CheckBox checkbox = new CheckBox();
if (this.comboBox_Meta.SelectedItem != null)
{
if (this.comboBox_Meta.SelectedIndex != 1)
{
checkbox.Checked = true;
}
else
{
checkbox.Checked = false;
}
this.my_Helper.SetValueFromCheckBox("xxx", checkbox);
}
}
我的ANT Profiler表示存在资源泄漏,如以下错误
在不处理“新CheckBox(...)”的情况下返回。
在我的SetValueFromCheckBox方法中,我使用以下条件。
some value = _checkbox.Checked;
注意:现在,在社区提供了有用的反馈之后,我添加了“使用”并等待下一次构建以进行错误验证。
答案 0 :(得分:3)
不,错误意味着您应该致电Dispose
。
或将其包装在using
块中:
using (var chk = new CheckBox())
{
// your code
} // at this line `Dispose` is called automatically, even in case of exception
每个Windows窗体控件都会创建一堆未自动释放的句柄等。它们中的大多数仅在显示控件时创建,因此可能没有dispose调用,但由于分析器不知道它会抱怨。最好总是处理实现IDisposable
的对象 - 你永远不知道实现是否会改变,对象将自己创建句柄。
文档:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
答案 1 :(得分:2)
将null
设置为实际处理它们是一种常见的误解。它不是。要处置CheckBox
,请调用其Dispose
方法。当您使用其他人建议的using
语句时,会自动完成此操作。
但是,当您将控件实际添加到控件树时,这不是必需的!在这种情况下,当处理表格时,控件将被处理掉。
答案 2 :(得分:0)
这意味着您应该在其上调用dispose或使用using语句。
using(CheckBox checkbox = new CheckBox())
{
if (this.comboBox_Meta.SelectedItem != null)
{
if (this.comboBox_Meta.SelectedIndex != 1)
{
checkbox.Checked = true;
}
else
{
checkbox.Checked = false;
}
this.my_Helper.SetValueFromCheckBox("xxx", checkbox);
}
}
答案 3 :(得分:0)
创建动态控件时,最终可以将控件添加到控件树中。
如果不这样做,就没有意义去创造这样的控制。
不将控件添加到树控件的直接副作用是您将错过开箱即用的控件树。当控件被处理时(窗体在顶层),其子控件将被递归地处理。
其他人建议添加using
声明,但我认为这是错误的。它将删除警告,但实际问题是您没有正确使用控件树。