C#:条件复杂的Debug.Assert()

C#:条件复杂的Debug.Assert(),c#,.net,assert,C#,.net,Assert,我正在编写一个库,其中它在内部使用ConcurrentQueue。在一个private方法中,我希望确保我当前拥有的项目是将要退出队列的项目(即,如果我没有错误地编写代码,这应该是预期的行为)。我如何正确地断言这一点 我目前的尝试是: #if DEBUG object peeked = null; queue.TryPeek(out peeked); Debug.Assert(peeked == itemThatWillBeDequeued); #endif 这在我看来

我正在编写一个库,其中它在内部使用
ConcurrentQueue
。在一个
private
方法中,我希望确保我当前拥有的项目是将要退出队列的项目(即,如果我没有错误地编写代码,这应该是预期的行为)。我如何正确地断言这一点

我目前的尝试是:

#if DEBUG
    object peeked = null;
    queue.TryPeek(out peeked);
    Debug.Assert(peeked == itemThatWillBeDequeued);
#endif
这在我看来很奇怪-如果我需要使用
#if
指令,那么我就不会使用
Debug.Assert()
。但是,我也无法直接将
ConcurrentQueue.TryPeek()
放入assert语句中。此外,内联操作可能意味着
ConcurrentQueue.TryPeek()
将在运行时在发行版中运行(除非我弄错了)


正确的方法应该是什么?

您可以用方法包装调用

Debug.Assert(itemThatWillBeDequeued.equals(PeekQueue(queue)));


如果要避免Bacon建议的额外方法,可以使用LINQ表达式:

Debug.Assert(((Func<object>)(() => {
    object peeked;
    return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);
Debug.Assert(((Func)(()=>{
偷看的对象;
返回队列.TryPeek(向外窥视)?窥视:空;
}))()==将要满足的项目);

说明:
((Func)(()=>{…}))
将从附带的代码创建函数对象。
()
将执行此函数并返回其结果。

方法
PeekQueue
不会在发布版本中编译吗?当然,但不会执行编写单元测试。我想知道编译器如何处理匿名函数。它会在发布版本中编译吗?不会,它不会在发布版本中编译。刚刚用ildasm检查了一下。谢谢,我也试过了,它看起来确实没有被编译。
Debug.Assert(((Func<object>)(() => {
    object peeked;
    return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);