【发布时间】:2011-02-20 20:36:50
【问题描述】:
#if DEBUG 在 C# 中的预处理指令有什么用?我们什么时候必须使用它?
【问题讨论】:
标签: c# debugging c-preprocessor
#if DEBUG 在 C# 中的预处理指令有什么用?我们什么时候必须使用它?
【问题讨论】:
标签: c# debugging c-preprocessor
编译时,您可以设置编译器标志,您可以使用这些标志将代码放入这些指令中。该代码将不会被编译,并且永远不会出现在最终的汇编输出中。 DEBUG 是预定义的之一,但您可以使用自己的。
作为使用示例:在当前的开发中,我们使用编译器标志来说明是使用登录掩码登录用户,还是使用当前主体自动登录。第二种模式仅供开发人员使用,例如无需登录即可更快地调试。
另一个例子:在一些单声道代码中你会看到标志。在这种情况下,代码可能会以不同的方式编译,例如针对不同的框架,因为它使用早期版本中可能不存在的类。
与此相关的是 Conditional-属性,您可以使用它来标记方法。如果未设置所述标志,则不会执行对该方法的调用。该方法仍然在 IL 中结束,但调用将被删除。
查看以下代码示例:
var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList();
var attribs = mthods[0].GetCustomAttributes(true);
您会注意到 Debug.WriteLine 方法应用了 Conditional 属性:当您在没有 DEBUG 编译器标志的情况下进行编译时,对它的调用将被删除。
【讨论】:
在调试模式下:
#if DEBUG
System.Console.WriteLine("Debug version");
#endif
System.Console.WriteLine("Output");
输出为
Debug version
Output
在发布模式下:
#if DEBUG
System.Console.WriteLine("Debug version");
#endif
System.Console.WriteLine("Output");
输出为
Output
用法:如果您有一组值要在调试模式下而不是在发布模式下进行测试,您可以使用#if DEBUG
【讨论】:
它在测试 Windows 服务时也会派上用场。您可以添加#if DEBUG 来手动启动您的进程,因此您不必安装服务并附加到它进行调试。
【讨论】:
Conditional 属性可能会让您感觉更舒服,该属性可用于排除整个方法,而无需在调用端使用条件使源复杂化:
[Conditional("DEBUG")]
void Foo()
{
}
Foo() 可以在调试和发布中安全地调用 - 但是在发布模式下,这将是一个空操作。
【讨论】:
!DEBUG)?
您根本不必使用它。它的目的是让部分代码只能在调试模式下编译。例如您可能有一些代码启用了主用户,可以伪装成系统中的任何其他用户来进行测试和调试目的。出于安全原因,您不希望在发布代码中启用该用户,因此您可以将相关代码部分包装在 #if DEBUG 中,并将它们从发布代码中排除。
【讨论】: