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

时间:2014-09-02 22:03:42

标签: c#

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

来自Microsoft当前的Queue.Peek Method文档:

screenshot

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

我认为Peek()的重点是让代码不会产生异常。

2 个答案:

答案 0 :(得分:10)

甚至MSDN提到了原因:

  

null可以作为值添加到队列中。要区分一个   null值和Queue的结尾,检查Count属性或catch   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
}

我认为您将queue.PeekdataReader.Read等方法混为一谈。区别在于Read使读者前进到下一个记录,只返回一个bool,表示是否有记录。 Queue.Peek也会返回&#34;记录&#34;。这是一个不同的目的,所以如果你想知道是否有Peek,请不要使用InvalidOperationException

顺便说一句,这种行为在框架中是一致的。如果您在空序列中使用Enumerable.First,其他方法也会抛出{{1}}。

答案 1 :(得分:4)

Peek的目的是查看队列的下一个元素,而不删除它。它未被删除的事实是PeekPop(.NET中的Dequeue)之间的主要区别。 (这与.NET无关;对于任何语言的队列结构,其Pop(/ Dequeue)返回弹出值,这是两者之间存在差异。

如果队列为空,则Queue无法返回。异常是返回值的唯一替代方法,因此这是适当的行为。捕获和处理异常,或者(如果您不担心竞争条件)在调用Peek / Dequeue之前检查队列是否为空。