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);