当源代码中存在Debug.Assert()
方法调用,并且我以发布模式编译时,即使它没有被调用,编译器是否会生成Debug.Assert()
的IL代码?
我们的其中一位开发人员最近添加了一个展示我们内部安全信息的Assert语句。有可能有人查看发布模式的IL代码并找出Assert语句的文本吗?
ConditionalAttribute
属性的Debug
类成员不会发出IL代码。虽然MSDN上没有明确提到,但以下两个引用很好地说明了行为,以增强Roy的答案:
因此,没有大小差异意味着根本没有输出,如果您使用Debug类中的方法打印调试信息并使用断言检查逻辑,则可以使代码更加健壮,而不会影响您的产品性能和代码大小。
这意味着,在编译器级别上,这些调用甚至在未定义将 ConditionalAttribute 属性应用于 Debug 的方法。支持 ConditionalAttribute 的编译器会忽略对这些方法的调用,除非将“DEBUG”定义为条件编译符号。请参阅编译器的文档,以确定是否支持 ConditionalAttribute 以及定义条件编译符号的语法。
DEBUG
的情况下也不会被考虑。默认情况下,除非您定义了DEBUG符号(并且默认情况下,对于Release版本,该符号已关闭),否则不会触发断言。
要验证,请在Visual Studio中打开您的项目属性,选择“生成”选项卡。它将显示“定义DEBUG常量”的复选框。如果在Release版本中启用了它,则断言将触发;否则,它们不会。
Debug
方法被装饰了[Conditional("DEBUG")]
。 - CodeNaked