#if/#endif与if有什么不同?

l--*_*''' 8 c#

我正在关注具有此代码的教程:

    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指令,允许您根据一个或多个符号的存在包含或排除代码.在为调试版本编译代码或编译特定配置时,这非常有用.


Nic*_*ver 5

这些用于编译器常量,例如:

#if DEBUG
  Debug.WriteLine("This is written in debug mode");
#endif
Run Code Online (Sandbox Code Playgroud)

如果DEBUG定义了常量,则该代码将被编译,如果不是,则将其剥离,被编译器忽略。

通常用于额外的调试类型语句,但它的可扩展性足以拥有许多应用程序,在您的情况下测试代码。


Xaq*_*ron 5

当您需要两个(或更多)版本的代码时,它很有用.然后,不要像使用编译器指令那样保留两个项目,就像#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!");反之亦然.