我正在编写一个库,它在内部使用ConcurrentQueue
。在其中一个private
方法中,我想确保我当前拥有的项是将被出列的项(即,如果我没有错误地编写代码,这应该是预期的行为(。我如何正确地断言这一点?
我目前的尝试是:
#if DEBUG
object peeked = null;
queue.TryPeek(out peeked);
Debug.Assert(peeked == itemThatWillBeDequeued);
#endif
这在我看来相当奇怪——如果我需要使用#if
指令,那么我就不会使用Debug.Assert()
。但是,我也不可能直接将ConcurrentQueue.TryPeek()
内联地放入assert语句中。此外,内联可能意味着ConcurrentQueue.TryPeek()
将在运行时在发行版中运行(除非我弄错了(。
正确的方法应该是什么?
如果您想避免Bacon建议的额外方法,可以使用LINQ表达式:
Debug.Assert(((Func<object>)(() => {
object peeked;
return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);
说明:((Func<object>)(() => { ... }))
将从附带的代码中创建一个函数对象。()
将执行此函数并返回其结果。
您可以将调用包装在方法中
Debug.Assert(itemThatWillBeDequeued.equals(PeekQueue(queue)));
static object PeekQueue(ConcurrentQueue queue)
{
object peeked = null;
queue.TryPeek(out peeked);
return peeked;
}