对于你必须编写自己的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
在这个范围内不再存在。
答案 0 :(得分:2)
它输出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));
}