Debug.Assert/Debug.Fail会自动有条件地编译#if "DEBUG“吗?或者它更像是如果没有附加调试器(即使是在发行版中),它不会做很多事情?如果是这样的话,将它们留在代码中是否会影响性能?或者它们真的不应该出现在产品代码中,而只是测试或条件代码中?
发布于 2009-03-07 23:45:20
不,如果没有定义符号,整个调用,包括任何表达式求值都会从编译中删除。这一点非常重要--如果表达式中有任何副作用,如果没有定义DEBUG,这些副作用就不会发生。下面是一个简短但完整的程序来演示:
using System;
using System.Diagnostics;
class Test
{
static void Main()
{
int i = 0;
Debug.Assert(i++ < 10);
Console.WriteLine(i);
}
}如果定义了DEBUG,则打印1,否则打印0。
由于这种行为,您不能在条件编译的方法上使用out参数:
using System;
using System.Diagnostics;
class Test
{
static void Main()
{
int i ;
MethodWithOut(out x);
}
[Conditional("FOO")]
static void MethodWithOut(out int x)
{
x = 10;
}
}这将产生以下错误:
Test.cs(13,6):错误CS0685:条件成员'Test.MethodWithOut(out int)‘不能有out参数
发布于 2009-03-07 23:46:16
API/Fail包含一个值为“ConditionalAttribute”的调试属性,如下所示
[Conditional("DEBUG")]
public void Assert(bool condition)如果在用代码编译方法调用时定义了常量DEBUG,则C#和VB编译器实际上只会包含对is方法的调用。如果没有,方法调用将从IL中省略
发布于 2009-03-07 23:50:06
是的,差不多吧。Debug方法使用Conditional(" Debug ")属性进行修饰,因此如果定义了DEBUG符号,则对DEBUG方法的调用不会编译到IL中。
有关ConditionalAttribute的更多信息,请访问MSDN。
https://stackoverflow.com/questions/622743
复制相似问题