2

私はそれがどのように機能するかをよく理解していないコードを書きました。

私の質問は、ラジオ ボタン イベントが発生したときに参照される for ループ内のローカル変数に関するものです。

これらのローカル変数のさまざまな「バージョン」をどのように追跡し、正しく動作させるのでしょうか? (つまり、結果のラジオ ボタンはそれぞれ、外部ローカル変数から派生した対応する値でイベントを発生させます)

public class RadioButtonPanel<T> : FlowLayoutPanel
{
    public RadioButtonPanel()
    {
        foreach (object value in Enum.GetValues(typeof(T)))
        {
            string name = Enum.GetName(typeof(T), value);
            var radioButton = new RadioButton { Text = name };
            radioButton.CheckedChanged += (s, e) =>
            {
                if (radioButton.Checked && this.Selected != null)
                    Selected((T)Enum.Parse(typeof(T), name));
            };
            this.Controls.Add(radioButton);
        }
    }

    public event SelectedEvent Selected;
    public delegate void SelectedEvent(T t);
}
4

2 に答える 2

3

これは、クロージャーを介して行われます。

基本的に、ローカル変数用の2つのプロパティと1つの関数を持つ小さなクラスがあなたに代わって作成されたと想像できます。ラムダが呼び出されると、基本的にそれらの1つを通知して関数を呼び出し、与えられた値を保持します。

C#仕様には、実際には、これがコンパイラーによってどのように行われるかについてのいくつかの非常に良い例があります。具体的にはセクション6.5.3

于 2012-08-24T01:22:22.573 に答える
1

それらはクロージャと呼ばれます。ウィキペディアを参照してください:http://en.wikipedia.org/wiki/Closure_ (computer_science )

基本的に、ラムダ内で非ローカル変数を使用できます。私が覚えていることから、これらの変数は関数の外部でコンパイルされるため、グローバルに使用できます。

于 2012-08-24T01:23:37.637 に答える