C#中#if DEBUG预处理器指令的用法是什么?什么时候必须使用它?

mas*_*ani 12 c# debugging c-preprocessor

#if DEBUGC#中预处理器指令的用法是什么?什么时候必须使用它?

ani*_*key 25

在调试模式下:

#if DEBUG
            System.Console.WriteLine("Debug version");
#endif
            System.Console.WriteLine("Output");
Run Code Online (Sandbox Code Playgroud)

输出为

Debug version
Output
Run Code Online (Sandbox Code Playgroud)

在发布模式下:

#if DEBUG
            System.Console.WriteLine("Debug version");
#endif
            System.Console.WriteLine("Output");
Run Code Online (Sandbox Code Playgroud)

输出为

   Output
Run Code Online (Sandbox Code Playgroud)

读这个:#if(C#参考)

用法:如果您有一组要在调试模式下测试的值而不是在发布模式下可以使用 #if DEBUG


stu*_*ith 17

您可能会对该Conditional属性感到更舒服,该属性可用于排除整个方法,而无需在调用端使条件复杂化源:

[Conditional("DEBUG")]
void Foo()
{
}
Run Code Online (Sandbox Code Playgroud)

Foo() 可以在调试和释放中安全地调用 - 但是在发布模式下,它将是一个无操作.

  • 这是一个特殊的IL命令,基本上说"什么都不做".当你将断点放在没有任何反应的地方时(例如一个开放的括号),这会特别有用 - 这样调试器可以同步代码并执行IL (7认同)

Ben*_*son 5

您根本不必使用它.它的目的是让代码段只能在调试模式下编译.例如,您可能有一些启用主用户的代码,可能假装是系统中用于测试和调试的任何其他用户.出于安全原因,您不希望在发布代码中启用该用户,因此您需要在#if DEBUG中包装相关的代码段,并且它们将从发布代码中排除.

  • 或者简单地说,在调试时不要显示启动画面,节省一两秒钟.类似的东西. (2认同)
  • @TomTom:怎么样,不要显示闪屏*永远*? (2认同)

flq*_*flq 5

编译时,您可以设置编译器标志,您可以使用这些标志将代码放入这些指令中.该代码将不会被编译,并且永远不会在最终的程序集输出中结束.DEBUG是预定义的一种,但您可以使用自己的.

作为使用示例:在当前的一个开发中,我们使用编译器标志来声明是否使用A登录掩码来登录用户,或者是否应该使用当前主体自动进行登录.第二种模式仅供开发人员使用,例如无需登录即可快速调试.

另一个例子:在某些单声道代码中,您将看到标志.在这种情况下,当例如针对不同的框架时,代码可以被不同地编译,因为它使用在早期版本中可能不存在的类.

与此相关的是Conditional -Attribute,您可以使用它来标记方法.如果未设置所述标志,则不会执行对该方法的调用.该方法仍然在IL中结束,但调用将被删除.

检查以下代码:

var mthods = typeof (Debug).GetMethods().Where(mi => mi.Name.Equals("WriteLine")).ToList();
var attribs = mthods[0].GetCustomAttributes(true);
Run Code Online (Sandbox Code Playgroud)

您会注意到Debug.WriteLine方法应用了Conditional属性:当您编译WITHOUT DEBUG编译器标志时,将删除对它的调用.