我有一个简单的队列来管理添加到我的应用程序中的项目。
来自Microsoft当前的Queue.Peek Method文档:
我认为Peek()的重点是让代码不会产生异常。
答案 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.Peek
与dataReader.Read
等方法混为一谈。区别在于Read
使读者前进到下一个记录,只返回一个bool
,表示是否有记录。 Queue.Peek
也会返回&#34;记录&#34;。这是一个不同的目的,所以如果你想知道是否有Peek
,请不要使用InvalidOperationException
。
顺便说一句,这种行为在框架中是一致的。如果您在空序列中使用Enumerable.First
,其他方法也会抛出{{1}}。
答案 1 :(得分:4)
Peek
的目的是查看队列的下一个元素,而不删除它。它未被删除的事实是Peek
和Pop
(.NET中的Dequeue
)之间的主要区别。 (这与.NET无关;对于任何语言的队列结构,其Pop
(/ Dequeue
)返回弹出值,这是两者之间存在差异。
如果队列为空,则Queue
无法返回。异常是返回值的唯一替代方法,因此这是适当的行为。捕获和处理异常,或者(如果您不担心竞争条件)在调用Peek
/ Dequeue
之前检查队列是否为空。