我正在编写一个在内部使用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>)(() => { ... }))将根据随附的代码创建一个函数对象。 ()将执行此功能并返回其结果。

10-08 16:56