C# 3.0 如何在C#(3.0)中使用#if指令

C# 3.0 如何在C#(3.0)中使用#if指令,c#-3.0,C# 3.0,我刚找到两段代码 #if CONSOLE // defined by the console version using ournamespace.FactoryInitializer; #endif 及 任何人都可以通过一个正在运行的示例(请提供一个简单的示例)告诉我这些代码片段的意义是什么,何时以及如何使用它们吗 谢谢。当然可以。这些是指可以在编译时定义的条件编译符号,它控制实际生成的代码。下面是一个例子: using System; class Test { static v

我刚找到两段代码

#if CONSOLE // defined by the console version using 
ournamespace.FactoryInitializer;
#endif

任何人都可以通过一个正在运行的示例(请提供一个简单的示例)告诉我这些代码片段的意义是什么,何时以及如何使用它们吗

谢谢。

当然可以。这些是指可以在编译时定义的条件编译符号,它控制实际生成的代码。下面是一个例子:

using System;

class Test
{
    static void Main()
    {
#if FOO
        Console.WriteLine("FOO was defined");
#endif        

#if BAR
        Console.WriteLine("BAR was defined");
#endif                
    }
}
如果你用

csc Test.cs
它不会打印任何东西。如果你用

csc Test.cs /D:FOO
然后它将打印“FOO已定义”-显然,对于BAR也是如此

注意,这些与C++宏不一样——符号是定义的还是不定义的;它本身没有“重置价值”

在Visual Studio中,可以指定应在项目属性的“生成”选项卡中定义哪些符号。此外,在文件的一开始,您可以明确定义和取消定义符号:

#define FOO
#undef BAR
这在调用用修饰的方法时非常重要-如果没有定义适当的符号,编译器将忽略此类调用。因此,如果您想确保所有调用都能通过,即使您没有为项目的其余部分定义调试符号,您可以使用:

#define DEBUG
...
Debug.Print("Foo");
就我个人而言,我并不经常使用这些。除此之外,如果您知道所有代码都将在执行时编译和运行,那么就更容易理解代码


编辑:只是澄清一下术语-
#if
#line
#pragma
等都是预处理器指令;FOO和BAR(在本例中)是条件编译符号。

您的项目可以有多种配置,最常见的是Debug和Release。 在调试模式下,您可以输出调试字符串,执行附加检查等

例如:

void a(int x){    
    #if DEBUG
    System.Diagnostics.Debug.WriteLine("a("+x+")");
    #endif
    //Do stuff.
}
csc foo.cs /define:DEBUG 
您可以在项目的属性中定义项目范围内的指令并进行调试/发布构建,也可以创建一个应用程序,该应用程序使用不同的库进行某些输出(OpenGL/XNA)。或者,假设使用了.NET FX 1.1,并且使用了适当的类,那么,
#if(if)NET(u 1)u 1(u 1)
会检查符号
(u NET)u 1(u 1)(u 1)(u 1)(u)u 1)。引用文件:

“#if”允许您开始条件指令, 测试一个或多个符号 看看他们的评价是否正确。如果 它们的计算结果是真的,编译器 计算#if之间的所有代码 下一个指令

因此,基本上,当您使用switch编译程序时,它要么计算if语句,要么不计算if语句。例如:

void a(int x){    
    #if DEBUG
    System.Diagnostics.Debug.WriteLine("a("+x+")");
    #endif
    //Do stuff.
}
csc foo.cs /define:DEBUG 
允许您定义调试指令并输入
#if DEBUG
分支。请记住,与语句相反,它们是纯编译时的,else语句的主体甚至不会包含在已编译的程序集中。

它们用于

如果在第一个示例中使用
#define CONSOLE
定义了控制台(称为条件编译符号),#If CONSOLE和#endif中的代码将被编译并内置到程序集中,否则编译器将忽略其中的代码

取消定义条件编译符号是通过#取消定义,例如
#取消定义控制台
。委员会还指出:

没有要求 条件编译符号可以是 在声明之前显式声明 在预处理中引用 表达。相反,未申报 符号只是没有定义,因此 将值设为false

我以为这个词是“预处理器指令”@Oded:#if是预处理器指令,但FOO和BAR本身是条件编译符号。术语“预处理器指令”范围更广,包括#pragma、#line等。