我正在关注具有此代码的教程:
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());
}
Run Code Online (Sandbox Code Playgroud)
使用的目的是什么#if TEST而不仅仅是if(TEST)?
Tom*_*Tom 22
因为using #IF将确定代码是否已编译.
使用if将确定代码是否被执行.
似乎在编译时定义了一个"环境"TEST.所以,如果那个环境存在,那么
if (i % 2 == 0)
continue;
Run Code Online (Sandbox Code Playgroud)
将被测试和执行:仅打印奇数.
需要注意的重要一点是,编译后的代码会根据存在而改变TEST.在"非测试环境"中
if (i % 2 == 0)
continue;
Run Code Online (Sandbox Code Playgroud)
执行应用程序时甚至不存在.
使用#IF TEST而不是if(TEST)的目的是什么?
TEST不是变量,也不是常数.它甚至不存在于运行时.它是一个传递给编译器的标志,因此它可以决定编译一些代码(即将它放入可执行文件中)
如果#if指令里面还有别的东西,也许会更清楚.让我们将您的代码段修改为:
#if TEST
if (i == 5)
System.exit(1)//Not a c# programmer;
#endif
Run Code Online (Sandbox Code Playgroud)
在这种情况下TEST,在程序存在的情况下,程序只会循环5次.在每次迭代时,i都将进行测试5.等一下!!!它甚至不会编译!
如果TEST未定义,则应用程序将继续,直到达到另一个退出条件.没有比较i反对5将进行.阅读更多关于指令的信息:
#if,以及#else,#elif,#endif,#define和#undef指令,允许您根据一个或多个符号的存在包含或排除代码.在为调试版本编译代码或编译特定配置时,这非常有用.
这些用于编译器常量,例如:
#if DEBUG
Debug.WriteLine("This is written in debug mode");
#endif
Run Code Online (Sandbox Code Playgroud)
如果DEBUG定义了常量,则该代码将被编译,如果不是,则将其剥离,被编译器忽略。
它通常用于额外的调试类型语句,但它的可扩展性足以拥有许多应用程序,在您的情况下测试代码。
当您需要两个(或更多)版本的代码时,它很有用.然后,不要像使用编译器指令那样保留两个项目,就像#if TEST在同一个项目中编写两个版本一样.然后从项目属性中,您可以为TEST llike TEST = true设置值,然后编译项目.
#if TEST
Console.WriteLine("Hello World!");
#else
Console.WriteLine("Goodbye World!");
#endif
Run Code Online (Sandbox Code Playgroud)
如果TEST = true,那就像你刚写的那样:Console.WriteLine("Hello World!");反之亦然.