采用以下示例:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
在发布模式下编译时,Debug.Assert
方法会发生什么? ExpensiveTest()
还会继续吗?如果没有,那么它是如何工作的(因为它不是一个可以设置为无评估的宏)?如果确实运行了,那么这不会破坏调试断言的目的吗?
答案 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类方法调用)。