0

次のコードがあります。

 protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 1; i < 5; i++)
        {

            Button btn = new Button();
            btn.ID = "button-" + i.ToString();
            btn.Text = "This is button-" + i.ToString();
            btn.Click += (senders, es) => test(i, PlaceHolder1, btn.ID);
            PlaceHolder1.Controls.Add(btn);
        }

    }

    protected void test(int num, PlaceHolder ph, string btnID)
    {
        Response.Write("The Button clicked on is:  " + num);
    }

なんらかの理由で、ボタンのいずれかをクリックするたびに、変数「num」に渡される数値が常に5であることを理解できないようです。誰もがなぜこれが起こるのか知っていますか? または、実際の数値を「num」に割り当てないのはなぜですか?

4

1 に答える 1

4

ループ変数を閉じています。それを使用するラムダを作成すると、その時点でiのコピーは取得されず、その変数がキャプチャされ、そのラムダが呼び出されたときに の値が使用されることが保証されます。これらの無名メソッドが実際に実行されるまでには、ループはかなり前に終了しているため、その時点での の値は です。iii5

修正は簡単です。5 つのボタンすべてが参照する変数を 1 つ持つのではなく、値のコピーを取得して、各ボタンが参照する独自の変数を持つようにします。

    for (int i = 1; i < 5; i++)
    {
        var temp = i;
        Button btn = new Button();
        btn.ID = "button-" + i.ToString();
        btn.Text = "This is button-" + i.ToString();
        btn.Click += (senders, es) => test(temp, PlaceHolder1, btn.ID);
        PlaceHolder1.Controls.Add(btn);
    }
于 2013-09-09T20:01:36.890 に答える