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(...)」を破棄せずに返します。

My SetValueFromCheckBox メソッドでは、以下の条件を使用しています。

some value = _checkbox.Checked;

注: コミュニティからの有益なフィードバックを受けて、「使用」を追加し、エラー検証のために次のビルドを待機しています。

4

4 に答える 4

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

于 2012-11-21T10:41:30.183 に答える
2

null設定すると実際に破棄されるというのはよくある誤解です。そうではありません。を破棄するには、そのメソッドCheckBoxを呼び出します。これは、他の人が提案したようにステートメントDisposeを使用すると自動的に行われます。using

ただし、これは実際にコントロール ツリーにコントロールを追加するときには必要ありません。その場合、コントロールはフォームが破棄されるときに破棄されます。

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

動的なコントロールを作成するときは、最終的にコントロールをコントロール ツリーに追加する必要があります。

そうしないと、そのようなコントロールを作成する意味がありません。

ツリー コントロールにコントロールを追加しないことの直接的な副作用は、コントロール ツリーの既定の Dispose を見逃すことです。コントロールが破棄されると (最上位のフォーム)、その子コントロールが再帰的に破棄されます。

using声明を追加することを提案する人もいますが、それは間違っていると思います。警告は削除されますが、実際の問題は、コントロール ツリーを適切に操作していないことです。

于 2012-11-21T10:46:14.060 に答える