#if/#endif与if相比有何不同?

问题描述:

我下面这个教程:#if/#endif与if相比有何不同?

 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

下面是一个相关的问题:http://*.com/questions/15744/how-do-you-use-define – 2010-10-05 22:47:47

当你需要差别不大代码的两个(或更多)版本上是有用的。然后,而不是保持使用编译器指令就像两个项目#if TEST你写在同一项目两个版本。然后从项目属性中,您可以为TEST设置值,如TEST = true,然后编译该项目。

#if TEST 
    Console.WriteLine("Hello World!"); 
#else 
    Console.WriteLine("Goodbye World!"); 
#endif 

如果TEST =真这就像你只是写:Console.WriteLine("Hello World!");,反之亦然。

因为使用#IF将决定代码是否被编译。使用if将决定代码是否被执行。

似乎有一个在编译时定义的“环境”测试。因此,如果存在这种环境,将会测试并执行:仅打印奇数。

需要注意的重要一点是,编译代码根据TEST的存在而变化。在“非测试环境”中,当执行应用程序时,甚至不存在即使不存在也不会存在的“0122”。

使用#IF TEST而不仅仅是(TEST)的目的是什么?

TEST不是一个变量,也不是一个常数。它甚至在运行时不存在。这是一个传递给编译器的标志,因此它可以决定编译某些代码(即将其放入可执行文件中)

如果#if指令还有其他内容,它可能会更清晰。让我们修改段将:

#if TEST 
      if (i == 5) 
       System.exit(1)//Not a c# programmer; 
#endif 

在这种情况下,存在TEST,该程序将只循环5次下。在每次迭代中,i将针对5进行测试。等一下!!! 它甚至不会编译

如果TEST没有定义,那么应用程序将继续,直到达到另一个退出条件。将不会进行i5的比较。 了解更多关于指令here

#如果,用的#else,#elif指令,#ENDIF和#define #undef指令一起,使您可以包含或排除 基于对 一个存在代码或更多的符号。在编译调试 版本的代码或编译特定 配置时,这可以是 。

这些是编译器常量,例如:

#if DEBUG 
    Debug.WriteLine("This is written in debug mode"); 
#endif 

如果DEBUG常量的定义,该代码被编译,如果它不那么它剥离出来,由编译器忽略..这是一种确定某种构建类型中的内容的方法,并将其从另一个构造中剥离出来。

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

这意味着,如果定义了预处理器变量测试,它有一个非零值的代码会被编译成所得到的程序。您可以通过将

 
#define TEST 1 

到你的程序在#if语句之前定义测试已代码编译。

如果(TEST)将业务拓展到如(1)如果你如上定义的测试。

+0

不完全 - 这是C#,它没有预处理器,不允许你以#定义这样的值。你可以,但是,定义符号的编辑中设置的一部分,在这种情况下'#如果TEST'就像在C/C'的#ifdef TEST' ++。 – 2010-10-05 22:51:06

+1

嗯...这还挺#看起来像在这样一个小的字体大小++ :) – 2010-10-05 23:02:30

MSDN

当C#编译器遇到的#if 指令,最终接着是 #endif指令,它将编译仅当 指定的符号被定义的指令之间的代码。 .. C#中的#if语句是布尔值,只测试符号是否已被定义。

你看到的是为编译器编写的宏语言。如果编译器在TEST模式下工作,这将包括线

if (i % 2 == 0) 
continue; 

要不然也不会。

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