2016-12-31 8 views
1

独自のAIをコーディングする必要のあるゲームでは、パラメータを使用してさまざまなメソッド呼び出しをエンキューする必要があります。例:パラメータを使用してさまざまなメソッド呼び出しをエンキューする

これは、ゲームの次のステップの冒頭ですべてのイベントを呼び出すのではなく、即座に呼び出す必要があります。 は、今私は小さながメソッドにパラメータを渡すためのコンセプトの証明書かれています:

namespace LambdaTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Queue<Action> q = new Queue<Action>(); 

      for (int i = 0; i < 5; i++) 
      { 
       q.Enqueue(new Action(() => { 
        // Methods should be called here 
        Console.WriteLine(i); 
       })); 
      } 

      foreach (Action a in q) 
       a(); 

      Console.ReadLine(); 
     } 
    } 
} 

最初に考えたのは、それが動作するように持っていました。 5x5の出力を見た後、私はなぜ0から4を出力しないのですか?iがこのスコープにもう存在しないため、なぜ実際に動作しますか?

  1. なぜ5x5を出力しますか?
  2. このようにパラメータを使用して異なるメソッド呼び出しをエンキューするにはどうすればよいですか?
+0

これはLINQとしなければならない:?ちょうどループ変数のコピーを取る内部ループの別々の変数を導入し、これを修正するには

(基本的に、あなたが見ているのは、 'i'の存続期間は、それを取得したすべての匿名関数がガベージコレクションの対象となるまで延長されていることです。) –

+0

is not()=> {} linq? – Steven

+0

いいえ、それはLINQと同時に導入され、* LINQ内で頻繁に使用されるラムダ式ですが、それ自体はLINQの一部ではありません。 –

答えて

1

それはiがあり、単一のi変数だし、それをキャプチャしているすべての匿名関数がゴミの対象となるまで、その寿命が延長された5である、なぜならあなたがアクションを実行している時間によって5の5倍を出力しますコレクション。

for (int i = 0; i < 5; i++) 
{ 
    // Declared *inside* the loop, so each iteration will have a separate variable 
    int copy = i; 
    q.Enqueue(() => Console.WriteLine(copy)); 
} 
関連する問題