如果Queue为Empty,Queue.Peek会抛出InvalidOperationException

jp2*_*ode 4 c#

我有一个简单的队列来管理添加到我的应用程序中的项目.

来自Microsoft目前的Queue.Peek方法文档:

截图

如果仍然引发无效操作异常,使用Peek()查看队列有什么意义?

我认为Peek()的重点是拥有不会产生异常的代码.

Tim*_*ter 10

甚至MSDN都提到了原因:

null可以作为值添加到Queue中.要区分null值和Queue的结尾,请检查Count属性或捕获InvalidOperationException,它在Queue为空时抛出.

因此,如果你试图查看第一个项目,队列抛出异常的原因是它可能是null.您想如何区分有效值null和没有项目?

如果队列包含值类型,则同样如此int.如果没有要查看的项目,它应该返回-1吗?不,-1可能是有效值,因此您不知道队列中是否有其他项目.

而是使用该Count属性检查队列是否为空:

var queue = new Queue<int>();
queue.Enqueue(-1);
while (queue.Count > 0)
{
    int current = queue.Peek();         // still in the queue
    Console.WriteLine(queue.Dequeue()); // now empty
}
Run Code Online (Sandbox Code Playgroud)

我假设你对这样queue.Peek的方法感到困惑dataReader.Read.不同之处在于Read将读者推进到下一个记录并返回一个bool指示是否有记录的记录.Queue.Peek也返回"记录".这是一个不同的目的,所以Peek如果你想知道是否有一个,请不要使用.

顺便说一句,这种行为在框架中是一致的.如果你在空序列中使用它们,其他方法 Enumerable.First也会抛出 InvalidOperationException.