C#:具有复杂条件的 Debug.Assert()
C#: Debug.Assert() with complex condition
我正在编写一个内部使用 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)));
...
static object PeekQueue(ConcurrentQueue queue)
{
object peeked = null;
queue.TryPeek(out peeked);
return peeked;
}
如果您想避免 Bacon 建议的额外方法,您可以使用 LINQ 表达式:
Debug.Assert(((Func<object>)(() => {
object peeked;
return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);
说明:((Func<object>)(() => { ... }))
将从封闭的代码中创建一个函数对象。 ()
将执行此函数并 return 结果。
我正在编写一个内部使用 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)));
...
static object PeekQueue(ConcurrentQueue queue)
{
object peeked = null;
queue.TryPeek(out peeked);
return peeked;
}
如果您想避免 Bacon 建议的额外方法,您可以使用 LINQ 表达式:
Debug.Assert(((Func<object>)(() => {
object peeked;
return queue.TryPeek(out peeked) ? peeked : null;
}))() == itemThatWillBeDequeued);
说明:((Func<object>)(() => { ... }))
将从封闭的代码中创建一个函数对象。 ()
将执行此函数并 return 结果。