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



我正在编写一个库,它在内部使用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;
}

最新更新