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

时间:2012-12-13 09:15:18

标签: c# .net visual-studio debugging assert

采用以下示例:

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

    Debug.Assert(ExpensiveTest());

    //Code...
}

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

4 个答案:

答案 0 :(得分:29)

  

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

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

如果查看documentation,声明将使用[ConditionalAttribute("DEBUG")]

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

ConditionalAttribute用于条件编译。有关详细信息,请参阅Bart de Smet's blog post on conditional compilation,以及C#4规范的第17.4.2节。

答案 1 :(得分:5)

Assertions in Managed Code - MSDN

  

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

同样来自同一个链接:

  

请注意,创建时对 Debug.Assert方法的调用会消失   您的代码的发布版本。这意味着检查的电话   释放版本中的平衡消失。要解决这个问题,   你应该用Trace.Assert替换Debug.Assert,而不是   在发布版本中消失

答案 2 :(得分:2)

根据Debug.Assert Method (Boolean) Debug方法仅在调试版本中编译。

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

答案 3 :(得分:1)

  

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

答案是“不”。来自Microsoft支持:How to trace and debug in Visual C#

  

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

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