Appearance
Queue
Queue 是什么
Queue<T> 是“队列”,特点是:先进先出,英文叫 FIFO,First In, First Out。
你可以把它想象成排队买奶茶:先排队的人先买到,后来的人站到队尾。
c
using System.Collections.Generic;
Queue<string> jobs = new Queue<string>();
jobs.Enqueue("Load");
jobs.Enqueue("Spawn");
jobs.Enqueue("Save");
Debug.Log(jobs.Dequeue()); // Load
Debug.Log(jobs.Dequeue()); // Spawn
Debug.Log(jobs.Dequeue()); // Save核心操作
Enqueue:入队,放到队尾。 Dequeue:出队,取出并移除队首。 Peek:查看队首,但不移除。 Count:当前有几个元素。 Clear:清空队列。
c
Queue<int> queue = new();
queue.Enqueue(10);
queue.Enqueue(20);
int first = queue.Peek(); // 10,还在队列里
int outOne = queue.Dequeue(); // 10,被移除了一定要防空队列
如果队列是空的,直接 Dequeue() 或 Peek() 会报错。
c
if (queue.Count > 0)
{
int value = queue.Dequeue();
}如果你的 Unity / .NET 版本支持,也可以用更安全的:
c
if (queue.TryDequeue(out int value))
{
Debug.Log(value);
}Unity 里常见用法
任务队列:把生成怪物、加载资源、寻路请求排起来,每帧处理一部分,避免瞬间卡顿。
c
Queue<System.Action> tasks = new Queue<System.Action>();
void Update()
{
int maxPerFrame = 3;
int count = 0;
while (tasks.Count > 0 && count < maxPerFrame)
{
System.Action task = tasks.Dequeue();
task.Invoke();
count++;
}
}对象池也常用 Queue:空闲对象排队,需要时取一个,用完再放回去。
c
Queue<GameObject> pool = new Queue<GameObject>();
GameObject Get()
{
if (pool.Count > 0)
return pool.Dequeue();
return Instantiate(prefab);
}
void Release(GameObject obj)
{
obj.SetActive(false);
pool.Enqueue(obj);
}Queue vs Stack vs List
Queue<T>:先进先出,适合任务、消息、对象池。 Stack<T>:后进先出,适合撤销、回退、状态栈。 List<T>:按下标访问,适合遍历、排序、随机访问。
常见坑
Queue 没有 queue[0] 这种下标访问。 foreach 遍历时不要 Enqueue 或 Dequeue 当前队列。 需要按顺序处理并移除元素时,用 while + Dequeue。
参考链接Microsoft QueueQueue.EnqueueQueue.DequeueQueue.PeekQueue.TryDequeueMicrosoft StackUnity Script Serialization Rules