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

28

请看以下例子:

public void Foo()
{
    //Code...

    Debug.Assert(ExpensiveTest());

    //Code...
}

当我在发布模式下编译时,Debug.Assert 方法会发生什么?ExpensiveTest() 仍然会运行吗?如果不运行,那么它是如何工作的(因为它不是可以设置为评估为无效的宏)?如果它确实运行,那么这不是违背了调试断言的目的吗?


2
它被标记为ConditionalAttribute,因此只有在调用程序集编译时设置了DEBUG符号时,该调用才会被包含。 - CodesInChaos
4个回答

39

在发布模式下编译时,Debug.Assert方法会被完全删除(包括调用ExpensiveTest),假设你的发布配置中未定义DEBUG条件编译符号。

如果您查看文档,可以看到声明使用的是[ConditionalAttribute("DEBUG")]

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

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


7

管理代码中的断言 - MSDN

在Visual Basic和Visual C#中,您可以使用位于System.Diagnostics命名空间中的Debug或Trace中的Assert方法。 调试类方法不包含在程序的发布版本中,因此它们不会增加发布代码的大小或降低速度。

同样来自于同一链接:

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


5
根据 Debug.Assert Method (Boolean)Debug 方法只在调试版本中编译。
因此,如果您构建正确的发布版本(有关详细信息,请参见菜单项 Debug/Configuration Manager),则此方法调用将被删除。

1
在C#中,Debug.Assert测试不会在发布模式下运行。根据Microsoft支持文档如何在Visual C#中跟踪和调试所述:您可以单独或同时使用Trace和Debug类在同一个应用程序中。在Debug Solution Configuration项目中,Trace和Debug输出都是活动的。该项目从这两个类生成输出到所有Listener对象。然而,Release Solution Configuration项目只生成来自Trace类的输出。Release Solution Configuration项目忽略任何Debug类方法调用。特别地,最后一句话明确表明Debug.Assert()语句(以及其他Debug类方法调用)在Release构建中被忽略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接