C# foreach循环内不要修改集合
之前在游戏中为了实现剧情脚本延时创建Npc的功能,写了这么一段代码:
LinkedList<CreateNpcTask> DelayCreateNpcTasks = new LinkedList<CreateNpcTask>(); void TickDelayCreateNpc() { foreach (CreateNpcTask task in DelayCreateNpcTasks) { task.timer += UnityEngine.Time.deltaTime; if (task.timer * 1000 > task.delay) { CreateNpcEntity(task.unitId); DelayCreateNpcTasks.Remove(task); } } } void AddCreateNpcTask(int unitId, float delay) { CreateNpcTask node = new CreateNpcTask(); node.unitId = unitId; node.delay = delay; DelayCreateNpcTasks.AddLast(node); }
之后一直没充分测试,丢在那一个多月,今天被测出来报异常,然后被主程揪了出来。
改成了这样:
List<CreateNpcTask> DelayCreateNpcTasks = new List<CreateNpcTask>(); void TickDelayCreateNpc() { DelayCreateNpcTasks.RemoveAll(delegate(CreateNpcTask task) { task.timer += UnityEngine.Time.deltaTime; if (task.timer * 1000 > task.delay) { CreateNpcEntity(task.unitId); return true; } return false; }); } void AddCreateNpcTask(int unitId, float delay) { CreateNpcTask node = new CreateNpcTask(); node.unitId = unitId; node.delay = delay; DelayCreateNpcTasks.Add(node); }
《C#本质论》第14章有这么一小节:
基本的语法没事还是要多翻翻啊。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Golang基础学习总结
- 下一篇: MySql查询优化,高并发控制