#if调试和调试版本?

时间:2018-09-24 21:11:14

标签: c#

如果在Visual Studio中进行调试,则以下代码将打印字符串。

#if DEBUG
Console.WriteLine("...In visual studio...");
#endif

如果直接在...\bin\Debug的指导下运行编译的exe文件,它将打印字符串吗?

2 个答案:

答案 0 :(得分:3)

所有#...指令均由编译器处理。在最终.exe文件中找到它们。它们在运行时执行。

这意味着在这种情况下,重要的是,编译时事物的状态是什么。如果将.exe构建为DEBUG构建,则将定义DEBUG常量,因此您的.exe文件将包含Console.WriteLine("...In visual studio...");行的代码。当您运行此.exe文件时,无论何时何地,无论如何,它都会将行输出到控制台。

另一方面,如果您将应用程序构建为RELEASE构建,则不会定义DEBUG常量,并且编译器也不会将该行添加到.exe文件中。无论您做什么,都不会获得.exe文件来打印行。如果您使用反编译器查看.exe文件,那么您甚至都不会在其中找到字符串"...In visual studio..."。好像您一开始从未写过该行一样。

答案 1 :(得分:2)

在哪里运行应用程序都无关紧要,重要的是如何构建它。当您选择debug build时,编译器会声明DEBUG常量,当您运行exe时,将执行if分支,因为已声明了常量。

在Visual Studio中,您可以通过转到Build下的Project Properties标签来查看已声明的常量,如果您尝试将构建模式更改为Release,则可以看到“ 定义DEBUG常量”将自动取消选中。