当源代码中存在Debug.Assert()
方法调用并且我在发布模式下编译时,编译器是否为Debug.Assert()
生成IL,即使它没有被调用?
我们的一位开发人员最近添加了一个Assert,显示有关内部安全性的信息。有人可以查看发布模式IL并找出断言的文本吗?
答案 0 :(得分:9)
默认情况下不,除非您定义DEBUG符号(默认情况下,对于已关闭的Release)。
要验证,请打开“项目属性”,然后在Visual Studio中选择“构建”窗格。它将显示复选框"定义DEBUG常量"。如果为Release打开它,则会触发断言;否则,他们不会。
答案 1 :(得分:7)
不,Debug
类(具有ConditionalAttribute
属性)的成员不会发出IL。有no explicit mention on MSDN,但以下两个引号暗示行为相当好,所以增加罗伊的答案:
如果使用Debug类中的方法来打印调试信息 并通过断言检查您的逻辑,您可以使您的代码更多 强大而不影响您的性能和代码大小 运输产品。
因此,没有尺寸差异意味着没有任何输出,
ConditionalAttribute属性应用于Debug的方法。 支持ConditionalAttribute的编译器忽略对这些的调用 除非“DEBUG”被定义为条件编译符号。 请参阅编译器的文档以确定是否 支持ConditionalAttribute和定义的语法 条件编译符号。
这意味着,在编译器级别,甚至不会考虑这些调用(未定义DEBUG
时。)