C#学习之预处理器指令

C#中存在很多“预处理器指令”的命令,这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面。例如,使用预处理器指令可以禁止编译器编译代码的某些部分,如果计划发布两个版本的代码,基本版和拥有更多功能的企业版本,就可以使用这些预处理器指令。在编译软件的基本版时,使用预处理器指令可以禁止编译器编译与额外功能相关的代码,另外,在编写提供调试信息的代码时,也可以使用预处理器指令。而与C/C++相比,C#并没有那么多的预处理器指令,它们的使用也不是很频繁。

1.#define和#undef
#define用法如下所示:
#define DEBUG
它告诉编译器存在给定的名称符号,在这里是DEBUG,这类似声明一个变量,但是这个变量没有真正的值,只是存在而已,而且只在编译代码时存在,在C#代码中没有任何的意义。如果定义的符号不存在,则#undef就没有任何意义。#undef正好相反,它是用来删除符号的定义:
#undef DEBUG
在编写#define和#undef时,必须放在C#源文件的开头位置,在声明要编译的任何对象的代码之前。

2.#if、#elif、#else 和 #endif
这些指令告诉编译器是否要编译某块代码。结合#define,看以下示例:
#define DEBUG
#undef DEBUG
#define TEST
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        
        static void Main(string[] args)
        {
            
            #if DEBUG
                Console.WriteLine("DEBUG");
            #endif
            #if TEST
            	Console.WriteLine("TEST");
            #endif
            Console.ReadKey();
        }
    }
}
在这里只会执行TEST那一块,输出TEST,而DEBUG由于在编译时已经删除定义,所以#if的判断为false。
#elif(=else if)和#else指令可以用在#if块中,其含义非常直观。
#define ENTERPRISE
#define W2K
//文件的最开始部分
#if ENTERPRISE
     #if W2K
          //some code here that is only relevant to ENTERPRISE
          //edition running on W2K
     #endif
#elif PROFESSIONAL
          // do something else
     #else
          //code for the leaner version
     #endif

在C#中还通过Conditional特性提供另一种机制编译代码,并非只有#if,由于现在还没有学习到,所以只能在后面总结。
#if和#elif还支持一组逻辑运算符“!”、“=”、“!=”、“||”。

3.#warning和#error
另外两个非常有用的预处理器指令时#warning和#error,当编译器遇到他们时,会分别产生警告或错误。如果是#warning,则会显示#warning 指令后面的文本,之后编译继续进行,如果是#error的话,会显示后面的文本,但是会立即退出编译。例如:
#if DEBUG && RELEASE
    #error "You've defined DEBUG AND RELEASE"
#endif
#warning "Don't forget to remove this line before the test"

4.#region和#endregion
#region和#endregion指令用于把一段代码标记为有给定名称的一个块,例如:
#region
     int x;
     double d;
#endregion
这些指令的优点是它们可以被某些编译器识别,这些编译器可以使用这些指令使代码在屏幕上更好地布局。
5.#line
#line指令可以用于改变编译器在警告和错误信息中显示文件名和行号信息。这条指令用的并不多。如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变输入的代码,就以使用这个指令,这样就意味着编译器报告的行号或文件名与文件中的行号或编辑的文件不匹配,#line指令可以用于还原这种匹配,也可以用#line default把行号还原为默认的行号。例如:
#line 164 "Core.cs"   //我们就会知道这是这个文件的第164行

#line default         //恢复默认的行号


6.#pragma
#pragma指令可以抑制或还原指定的编译警告,与命令行选项不同,#pragma指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。例如:
#pragma warning disable 169
public class MyClass
{
      int neverUsedField;
}
#pragma warning restore 169
 它的语法如下
#pragma pragma-name pragma-argument
pragma-name 可用于识别pragma的名称
pragma-argument 特定于pragma的参数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值