gpt4 book ai didi

c# - 使用参数排队各种方法调用

转载 作者:行者123 更新时间:2023-11-30 23:17:29 25 4
gpt4 key购买 nike

对于您必须编写自己的 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. 如何用这种方式将不同的方法调用加入队列?

最佳答案

它输出 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));
}

关于c# - 使用参数排队各种方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com