0
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 说有资源泄漏,如下错误

返回而不处理“new CheckBox(...)”。

在我的 SetValueFromCheckBox 方法中,我使用以下条件。

some value = _checkbox.Checked;

注意:现在在社区提供有用的反馈后,我添加了“使用”并等待下一次构建以进行错误验证。

4

4 回答 4

3

No, the error means you should call Dispose.

or wrap it in a using block:

using (var chk = new CheckBox())
{
    // your code
} // at this line `Dispose` is called automatically, even in case of exception

Every Windows Forms control creates a bunch of handles etc. that are not freed automatically. Most of them are only created when the control is displayed so you might be ok without the dispose call but since the profiler does not know that it will complain. And it is a best practice to always dispose objects that implement IDisposable - you never know if the implementation will change and the object will create handles by itself.

Documentation: http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

于 2012-11-21T10:41:30.183 回答
2

将事物设置为null实际处置它们是一种常见的误解。它不是。要处理CheckBox,请调用其Dispose方法。当您按照其他人的建议使用该using语句时,这会自动完成。

但是,当您实际将控件添加到控件树时,这不是必需的!在这种情况下,控件将在表单被处置时被处置。

于 2012-11-21T10:41:09.347 回答
0

It means you should call dispose on it or use the using statement.

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);
    }
}
于 2012-11-21T10:41:18.427 回答
0

当您创建动态控件时,您最终应该将控件添加到控件树中。

如果你不这样做,那么创建这样的控制是没有意义的。

不将控件添加到树控件的直接副作用是您将错过控件树的开箱即用 Dispose。当一个控件被释放(顶层的窗体)时,它的子控件将被递归释放。

其他人建议添加一个using声明,但我认为这是错误的。它将删除警告,但实际问题是您没有正确使用控件树。

于 2012-11-21T10:46:14.060 回答