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

标签 c# .net 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>)(() => { ... }))将从随附的代码创建一个函数对象。 ()将执行此函数并返回其结果。

关于C#:具有复杂条件的 Debug.Assert(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58799035/

相关文章:

c# - 如何使用 CaSTLe Windsor 通过 WPF 应用程序实现正确的 Di

c# - 以编程方式更改播放设备 xp

c# - .NET 的整数不就是简单地基于补码系统吗?

javascript - 断言在磁带中抛出 - Node

c# - 断言方法错误

c# - Emgucv Convert<Hsv, Byte>() 图片

c# - 如何实现 "masterpage"级别的逻辑

c# - 是否可以在同一位置添加多个面板

c# - 代码有点困惑

java - 如何在比较列表 <String> 的 testNG 软断言中查看所有 AssertionError 消息