注:在了解这部分之前,我也问了一部分人,都一致认为目前基本在c#不会用到这个。这块比如说在原来电脑内存比较小,而且有跨平台等操作这个比较多。
1:条件编译
条件编译属于编译预处理的范畴,与c++不同,c#没有独立的预处理器。C#中的预处理指令仅仅用来与c保持一致,而不是编译器开始编译代码之前得一个单独的处理步骤,他是作为词法分析的一部分来执行的。
Msdn关于条件编译的说明:
可以使用条件编译选择特定的代码节进行编译,而排除其他代码节。例如,可能需要编写调试语句来比较同一编程任务的不同方法的速度,或者可能需要本地化用于多种语言的应用程序。条件编译语句被设计为在编译时(而不是在运行时)运行。
2:条件编译指令
条件编译指令有以下四种:#if、#elif、#else、#endif
这些条件编译指令用来有条件的将部分程序段包括进来或排除在外。他们和c#中的if语句有类似的作用。
条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。
他们在程序中的出现的先后顺序必须是这样:
一条#if语句(必须有)
零或多条#elif语句
零或一条#else语句
一条#endif语句(必须有)
#if (Debug && !Mytest)
Console.WriteLine("Debug is defined");
#elif (!Debug && Mytest)
Console.WriteLine("Mytest is defined");
#elif (Debug && Mytest)
Console.WriteLine("Debug and Mytest are defined");
#else
Console.WriteLine("Debug and Mytest are not defined");
console.ReadLine();
#endif
3:Conditional
当调用标记为条件的方法时,指定的预处理符号的存在或不存在决定是否包含或省略此调用。如果定义了该符号,则包含调用;否则省略调用。使用 Conditional 是封闭 #if 和 #endif 内部方法的替代方法
classDebug
{
staticvoidMain(string[] args)
{
Print1();
Print2();
Print3();
Console.ReadLine();
}
[Conditional("DEBUG")]
staticvoid Print1()
{
Console.WriteLine("1111111111111111111111111111");
}
//定义了debug或者trace后才执行
//或者的关系
[Conditional("DEBUG"), Conditional("Trace")]
staticvoid Print2()
{
Console.WriteLine("222222222222222222222222");
}
//只有定义了Debug和Trace后才会执行此方法
[Conditional("DEBUGAndTrace")]
staticvoid Print3()
{
Console.WriteLine("33333333333333333333333333333333");
}
}
4:发出错误和警告信息
预编译和条件编译指令可以帮助我们在程序执行过程中发出编译的错误或警告,相应的指令时#warning和#Error
# 程序员参考 #define请参见 C# 预处理器指令 | 条件方法教程 #define 使您得以定义符号,这样,通过将该符号用作传递到 #if 指令的表达式,该表达式将计算为 true。 #define symbol 其中: symbol 要定义的符号名称。 备注 符号可用于指定编译的条件。可以用 #if 或 #elif 来测试符号。还可以使用 conditional 属性执行条件编译。 可以定义符号,但是无法对符号赋值。#define 指令必须在使用任何也不是指令的指令之前出现在文件中。 也可以用 /define 编译器选项定义符号。可以用 #undef 取消定义符号。 用 /define 或 #define 定义的符号与具有同一名称的变量不冲突。即,不应将变量名传递到预处理器指令,并且只能用预处理器指令计算符号。 用 #define 创建的符号的范围是在其中定义该符号的文件。 示例 有关如何使用 #define 的示例,请参见 #if。 请参见 C# 预处理器指令 | 条件方法教程