1

次の例では、1秒後に数値「5」を5回出力します。

for (int i = 0; i < 5; ++i)
{
    EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}

EasyTime.SetTimeout( JavaScriptのように動作すると仮定しますsetTimeout

iコールバックの値を記憶し続けるように、クロージャを作成するにはどうすればよいですか?

JavaScriptでそれを行う方法は知っていますが、C#でも同じようにできるかどうかはわかりません。

4

2 に答える 2

8

ブロック内で、次のようにiを新しい変数jに割り当て、ラムダでjを使用します。

for (int i = 0; i < 5; ++i)
{
    int j = i;
    EasyTimer.SetTimeout(() => Console.WriteLine(j), 1000);
}

特に、この問題はラムダのクロージャでiあるために発生するだけであり、ラムダが作成されたときではなく、実行されたときに値を取得します。

于 2012-12-30T05:40:04.477 に答える
2

C#5.0を使用している場合は、次のように記述できます。

foreach (int i in Enumerable.Range(0, 5))
{
    EasyTimer.SetTimeout(() => Console.WriteLine(i), 1000);
}

ローカル変数を自動的に生成します。これはforeachループでのみ機能し、forでは機能しません。

于 2012-12-30T09:55:34.323 に答える