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

时间:2010-10-05 22:27:04

标签: 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());
        }

使用#if TEST代替if(TEST)

的目的是什么?

6 个答案:

答案 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,则应用程序将继续,直到达到另一个退出条件。不会对i5进行比较。 阅读有关指令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;

否则它不会。

这些值通常在项目的属性中定义。只需右键单击您的项目并选择“属性”,然后选择“编译”(在内存中工作,此处;))