我正在关注包含此代码的教程:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
int i = 1;
while (true)
{
#if TEST
if (i % 2 == 0)
continue;
#endif
i++;
Console.WriteLine("The value of i is {0}", i);
if (i > 9)
break;
}
Console.WriteLine("The value of i is {0}", i);
Application.Run(new Form1());
}
使用#if TEST
代替if(TEST)
?
答案 0 :(得分:20)
因为使用#IF
将确定代码是否已编译。
使用if
将确定代码是否已执行。
似乎有一个在编译时定义的“环境”TEST。因此,如果存在该环境,
if (i % 2 == 0)
continue;
将被测试并执行:仅打印奇数。
需要注意的重要一点是,编译后的代码会根据TEST
的存在而变化。在“非测试环境”中
if (i % 2 == 0)
continue;
在执行应用程序时甚至不存在。
使用#IF TEST而不是if(TEST)的目的是什么?
TEST
不是变量,也不是常数。它甚至不存在于运行时。它是一个传递给编译器的标志,因此它可以决定编译一些代码(即将它放入可执行文件中)
如果#if
指令里面还有别的东西,也许会更清楚。让我们将您的代码段修改为:
#if TEST
if (i == 5)
System.exit(1)//Not a c# programmer;
#endif
在这种情况下,在TEST
的存在下,程序将只循环5次。在每次迭代时,i
将针对5
进行测试。等一下!!! 它甚至不会编译!
如果未定义TEST
,则应用程序将继续,直到达到另一个退出条件。不会对i
与5
进行比较。
阅读有关指令here的更多信息:
#if,以及#else,#elif,#endif,#define和#undef指令,让你包括或 排除基于存在的代码 一个或多个符号。这可以 在编译调试代码时很有用 构建或编译特定的 配置。
答案 1 :(得分:5)
当您需要两个(或更多)版本的代码时,这很有用。然后,不是使用像#if TEST
这样的编译器指令保留两个项目,而是在同一个项目中编写两个版本。然后从项目属性中,您可以为TEST llike TEST = true设置值,然后编译项目。
#if TEST
Console.WriteLine("Hello World!");
#else
Console.WriteLine("Goodbye World!");
#endif
如果 TEST = true ,就像你写的那样:Console.WriteLine("Hello World!");
,反之亦然。
答案 2 :(得分:3)
这些用于编译器常量,例如:
#if DEBUG
Debug.WriteLine("This is written in debug mode");
#endif
如果定义了DEBUG
常量,那么代码就会被编译,如果没有,那么它就会被剥离掉,被编译器忽略。这是一种确定某种构建类型中的内容并剥离出来的方法。
通常用于其他调试类型语句,但它可扩展到足以拥有许多应用程序,在您的案例中测试代码。
答案 3 :(得分:2)
这意味着如果您已经定义了预处理器变量TEST并且它具有非零值,则代码将被编译到生成的程序中。您可以通过添加
来定义TEST#define TEST 1
在#if语句之前进入你的程序,以编译该代码。
if(TEST)将扩展为if(1),如果您定义了上述测试。
答案 4 :(得分:1)
来自MSDN:
当C#编译器遇到#if时 指令,最后是一个 #endif指令,它只会在指令之间编译代码 指定的符号已定义... C#中的#if语句为布尔值,仅测试符号是否已定义。
答案 5 :(得分:1)
您所看到的是为编译器编写的宏语言。如果编译器在TEST
模式下工作,则它将包含行
if (i % 2 == 0)
continue;
否则它不会。
这些值通常在项目的属性中定义。只需右键单击您的项目并选择“属性”,然后选择“编译”(在内存中工作,此处;))