2012-04-03 29 views
8

Debug.Assert()方法调用存在于源代码中,并且我在发布模式下编译时,编译器是否为Debug.Assert()生成IL,即使它未被调用?Debug.Assert是否在发布模式下生成IL?

我们的一位开发人员最近添加了一个Assert,它显示有关我们内部安全的信息。有人可以看看发布模式IL并找出断言的文本吗?

+0

看看我的[旧博客条目(HTTP(如果没有定义DEBUG)://tjoe.wordpress .com/2007/12/03/cotw-conditionalattribute-class /),请记住'Debug'方法使用'[Conditional(“DEBUG”)]'装饰。 – CodeNaked 2012-04-03 15:08:35

回答

9

默认情况下,它的确不是而是,除非您定义DEBUG符号(并且默认情况下,对于已关闭的发布)。

要验证,请打开您的项目属性并在Visual Studio中选择生成窗格。它会显示复选框“Define DEBUG constant”。如果它在Release中打开,则断言将会触发;否则,他们不会。

7

不,Debug类的成员(具有ConditionalAttribute属性)不会发射IL。有no explicit mention on MSDN,但以下两个引号暗示的行为相当不错,所以要增加罗伊的回答是:

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

所以,没有大小差异意味着没有从这些任何输出,并且

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

这意味着,在编译器级别,这些调用甚至不会被视为

+0

MSDN确实在[方法级别文档](http://msdn.microsoft.com/en-us/library/kssw4w7z.aspx)上明确显示了该属性。它没有说明属性的作用,但你总是可以查找属性本身的文档。 – 2014-12-06 17:21:07

相关问题