2016-12-31 21 views
1

對於需要爲自己的AI編碼的遊戲,我需要使用參數排隊各種方法調用。例如:使用參數排隊各種方法調用

MessageReceived(string text, Source source); 
MiningCompleted(ResourceData data); 

這做,調用所有事件在遊戲的下一個步驟的開端,而不是瞬間。 現在我已經寫了參數傳遞給方法的小證明的概念:

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

不,它是lambda表達式 - 與LINQ同時引入,在* LINQ中大量使用*,但它本身不是LINQ的一部分。 –

回答

1

它輸出5五次,因爲你在執行行動時,i是5.這裏只有一個i變量,它的壽命延長,直到已抓獲這一切匿名函數符合垃圾採集。

爲了解決這個問題,只是介紹這需要循環變量的副本,一個獨立的變量循環:

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)); 
}