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等。