【问题标题】:how is #if / #endif different than if?#if / #endif 与 if 有何不同?
【发布时间】:2010-10-05 22:27:04
【问题描述】:

我正在关注包含此代码的教程:

    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) 的目的是什么?

【问题讨论】:

标签: c#


【解决方案1】:

因为使用#IF会判断代码是否被编译。

使用if 将确定代码是否被执行。

似乎在编译时定义了一个“环境”测试。因此,如果存在该环境,则

if (i % 2 == 0)
continue;

将被测试和执行:只打印奇数。

需要注意的重要一点是,编译后的代码会根据TEST 的存在而改变。在“非测试环境”中

if (i % 2 == 0)
continue;

在应用程序执行时甚至不存在。

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

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

如果#if 指令里面有别的东西可能会更清楚。让我们将您的 sn-p 修改为:

#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 指令一起,允许您包含或 基于存在的排除代码 一个或多个符号。这可以是 在为调试编译代码时很有用 构建或编译特定的 配置。

【讨论】:

    【解决方案2】:

    当您需要两个(或更多)版本的代码且差别不大时,它会很有用。然后,不要使用像 #if TEST 这样的编译器指令来保留两个项目,而是在同一个项目中编写两个版本。然后从项目属性中,您可以设置 TEST 的值,例如 TEST = true,然后编译项目。

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

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

    【讨论】:

      【解决方案3】:

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

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

      如果定义了DEBUG 常量,则该代码将被编译,如果不是,则将其剥离,被编译器忽略..这是一种确定某种构建类型中的内容的方法,然后将其剥离为另一种。

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

      【讨论】:

        【解决方案4】:

        这意味着如果你定义了预处理器变量TEST并且它有一个非零值,那么代码将被编译到结果程序中。您可以通过放置来定义TEST

        #define TEST 1
        

        #if 语句之前将代码编译到您的程序中。

        如果您如上所述定义了TESTif(TEST) 将扩展为if(1)

        【讨论】:

        • 不完全——这是 C#,它没有预处理器,也不允许你像这样 #define 值。但是,您可以将符号定义为编译设置的一部分,在这种情况下,#if TEST 的作用类似于 C/C++ 中的 #ifdef TEST
        • 嗯...在这么小的字体大小下 # 有点像 ++ :)
        【解决方案5】:

        您看到的是为编译器编写的宏语言。如果编译器在TEST 模式下工作,它将包含这些行

        if (i % 2 == 0)
        continue;
        

        否则不会。

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

        【讨论】:

          【解决方案6】:

          来自Microsoft Docs

          当 C# 编译器遇到 #if 指令,最后是 #endif 指令时,它仅在定义了指定符号的情况下编译指令之间的代码

          ...

          C# 中的#if 语句是布尔值,仅测试符号是否已定义。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-08
            • 1970-01-01
            • 2014-10-04
            • 2011-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多