在 C# 中,是在发布模式下运行的 Debug.Assert 测试



举个例子:

public void Foo()
{
    //Code...
    Debug.Assert(ExpensiveTest());
    //Code...
}

在发布模式下编译时,Debug.Assert 方法会发生什么情况?ExpensiveTest()还会跑吗?如果没有,那么它是如何工作的(因为它不是一个可以设置为零的宏)?如果它确实运行了,那么这不会破坏调试断言的目的吗?

在发布模式下编译时,Debug.Assert 方法会发生什么情况?

它被完全删除(包括对ExpensiveTest的调用),假设您没有在发布配置中定义的DEBUG条件编译符号。

如果您查看文档,声明使用 [ConditionalAttribute("DEBUG")]

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)

ConditionalAttribute用于条件编译。有关更多详细信息,请参阅 Bart de Smet 关于条件编译的博客文章,以及 C# 4 规范的第 17.4.2 节。

托管代码中的断言 - MSDN

在 Visual Basic 和 Visual C# 中,可以使用 "调试"或"跟踪",位于"系统诊断"命名空间中。 调试类方法不包含在程序的发布版本中,因此它们不会增加大小或降低 您的发布代码。

也来自同一链接:

请注意,对 Debug.Assert 方法的调用在创建时消失 代码的发布版本。这意味着检查的调用 余额在发布版本中消失。为了解决这个问题, 您应该将 Debug.Assert 替换为 Trace.Assert,它不会 在发布版本中消失

根据Debug.Assert方法(布尔值),Debug方法仅在调试版本中编译。

因此,如果您构建了正确的发布版本(有关详细信息,请参阅菜单项Debug/Configuration Manager),此方法调用将被删除。

问。在 C# 中,Debug.Assert 测试是否在发布模式下运行?

答案是否定的。从Microsoft支持: 如何在 Visual C# 中跟踪和调试:

可以分别使用 TraceDebug 类,也可以 一起在同一个应用程序中。在调试解决方案配置中 项目,跟踪调试输出都处于活动状态。该项目 从这两个类生成输出到所有侦听器 对象。但是,仅发布解决方案配置项目 从跟踪类生成输出。发布解决方案 配置项目忽略任何调试类方法调用。

特别是,最后一句话清楚地表明,Debug.Assert()语句(以及其他 Debug 类方法调用)在发布版本中被忽略。

最新更新