使用参数排入各种方法调用

时间:2016-12-31 10:39:06

标签: c# linq methods parameters

对于你必须编写自己的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. 如何以这种方式用参数排队不同的方法调用?

1 个答案:

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