举个例子:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
Debug.Assert
当我在发布模式下编译时,该方法会发生什么?ExpensiveTest()
还会跑吗?如果不是,那么它是如何工作的(因为它不是一个可以设置为空值的宏)?如果它确实运行,那么这不是破坏调试断言的目的吗?
举个例子:
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 节。
在 Visual Basic 和 Visual C# 中,您可以使用 System.Diagnostics 命名空间中的 Debug 或 Trace 中的 Assert 方法。 调试类方法不包含在程序的发布版本中,因此它们不会增加发布代码的大小或降低发布代码的速度。
也来自同一个链接:
请注意,当您创建代码的发布版本时,对 Debug.Assert 方法的调用会消失。这意味着检查余额的调用在 Release 版本中消失了。要解决这个问题,应该将Debug.Assert替换为Trace.Assert,在Release版本中不会消失
根据Debug.Assert Method (Boolean) Debug
方法仅在调试版本中编译。
因此,如果您构建正确的发布版本(Debug/Configuration Manager
有关详细信息,请参阅菜单项),此方法调用将被删除。
问:在 C# 中,Debug.Assert 测试是否在发布模式下运行?
答案是不。” 来自 Microsoft 支持:如何在 Visual C# 中跟踪和调试:
您可以在同一应用程序中单独或一起使用Trace和Debug类。在调试解决方案配置项目中,跟踪和调试输出都处于活动状态。该项目将这两个类的输出生成到所有Listener 对象。但是,发布解决方案配置项目仅从Trace类生成输出。发布解决方案配置项目忽略任何Debug类方法调用。
特别是,最后一句清楚地表明,Debug.Assert()
语句(以及其他 Debug 类方法调用)在 Release 构建中被忽略。