Debug.Assert在发布模式下会生成IL吗?

10

当源代码中存在Debug.Assert()方法调用,并且我以发布模式编译时,即使它没有被调用,编译器是否会生成Debug.Assert()的IL代码?

我们的其中一位开发人员最近添加了一个展示我们内部安全信息的Assert语句。有可能有人查看发布模式的IL代码并找出Assert语句的文本吗?


查看我的旧博客文章,请注意Debug方法被装饰了[Conditional("DEBUG")] - CodeNaked
2个回答

10
不,带有ConditionalAttribute属性的Debug类成员不会发出IL代码。虽然MSDN上没有明确提到,但以下两个引用很好地说明了行为,以增强Roy的答案:

如果您使用Debug类中的方法打印调试信息并使用断言检查逻辑,则可以使代码更加健壮,而不会影响您的产品性能和代码大小。

因此,没有大小差异意味着根本没有输出,

将 ConditionalAttribute 属性应用于 Debug 的方法。支持 ConditionalAttribute 的编译器会忽略对这些方法的调用,除非将“DEBUG”定义为条件编译符号。请参阅编译器的文档,以确定是否支持 ConditionalAttribute 以及定义条件编译符号的语法。

这意味着,在编译器级别上,这些调用甚至在未定义DEBUG的情况下也不会被考虑。

MSDN在方法级文档中明确显示了该属性。它没有说明该属性的作用,但您可以查找该属性本身的文档。 - Scott Chamberlain

9

默认情况下,除非您定义了DEBUG符号(并且默认情况下,对于Release版本,该符号已关闭),否则不会触发断言。

要验证,请在Visual Studio中打开您的项目属性,选择“生成”选项卡。它将显示“定义DEBUG常量”的复选框。如果在Release版本中启用了它,则断言将触发;否则,它们不会。


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