C#中的预处理器指令

简介:

C#有许多名为预处理器指令的命令。这些命令从来不会被翻译为可执行代码中的命令,但会影响编译过程的各个方面。例如,预处理器可禁止编译器编译代码的某一部分。如果计划发布两个版本的代码,比如基本版本和企业版本,或者针对不同的.NET Framework版本进行编码,就可以使用这些指令。在Anthem.NET的代码中我们经常可以看到这种用法。

预处理器指令的开头都有符号#。

注意

C#中并没有一个像C++那样的独立预处理器,所谓的预处理器指令仍由编译器处理

下面将对这些指令逐一介绍。

1. #define和#undef

#define可以定义符号。当将符号用作传递给#if指令的表达式时,此表达式的计算结果true。如

#define DEBUG

告诉编译器存在给定名称的符号,在本例中是DEBUG。这个符号不是实际代码的一部分,只在编译代码时存在。

#undef正好相反,它删除一个符号。

必须把#define和#undef命令放在C#源码的开头,即在要编译的任何代码之前。它不像C++中那样可以定义常数值。

#define本身并无大用,它需要配合#if指令使用。

2. #if, #elif, #else和#endif

这些指令告诉编译器是否要编译某个代码块。看下面的方法:

    static void PrintVersion()
    {
        #if V3
            Console.WriteLine("Version 3.0");
        #elif V2
            Console.WriteLine("Version 2.0");
        #else
            Console.WriteLine("Version 1.0");
        #endif
    }
 

上面的代码会根据定义的符号来打印不同的版本信息。 这种方式成为条件编译

注意

使用#if不是条件编译代码的唯一方式,C#还提供了通过Conditional属性的机制。

#if和#elif还支持一组逻辑运算符!=,==,!=和|| 。如果符号存在,符号的值被认为是true,否则为false,如:

#if V3 || (V2 == true) // if 定义了V3或V2符号...

3. #warning和#error

这也是两个很有用的预处理器指令,编译器遇到它们时,会分别产生警告或错误信息。如果遇到#warning指令,会向用户显示#warning指令后面的文本。实际上,在VS2005中,IDE会直接将信息标识出来:

warning

而如果编译器遇到#error,就会立即退出编译,不会产生IL代码。

4. #region和#endregion

#region和#endregion指令用于把一段代码标记为有指定名称的一个块,如下所示:

    #region private methods
 
    private int x;
    private int y;
 
    #endregion

这两个指令不会影响编译过程。但可以为VS编辑器所识别,从而使得代码显示布局更为清晰。

5. #line

该指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。如果编写代码时,要使用某些软件包改变键入的代码,就可以使用这个指令。

6. #pragma,#pragma warning,#pragma checksum

#pragma:为编译器提供特殊的指令,说明如何编译包含杂注的文件。

#pragma warning:可启用或禁用某些警告。

#pragma checksum:生成源文件的校验和,以帮助调试ASP.NET页。


本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2008/03/02/csProcessor.html,如需转载请自行联系原作者。

目录
相关文章
|
7月前
|
编译器 C# 开发者
C# 10.0中的全局`using`指令:简化命名空间引用的新方式
【1月更文挑战第4天】本文介绍了C# 10.0中引入的全局`using`指令,该指令允许开发者在项目级别统一管理命名空间引用,从而消除源文件中重复的`using`语句。全局`using`指令通过减少冗余代码、提高可维护性和统一命名空间管理,为开发者带来了更高效的编码体验。文章详细解释了如何实现全局`using`指令,并探讨了其在实际项目中的优势和适用场景。
|
4月前
|
编译器 C#
C# 预处理指令
C# 预处理指令
25 0
|
6月前
|
编译器 C# C++
【.NET Core】C#预处理器指令
【.NET Core】C#预处理器指令
81 1
|
6月前
|
C#
C# 命名空间和 using 指令详解
C# 命名空间和 using 指令详解
|
编译器 C# C++
C#——预处理器指令
C#——预处理器指令
125 0
|
编译器 C# C++
☀️ 学会编程入门必备 C# 最基础知识介绍(六)——接口、命名空间、预处理指令、正则表达式、异常处理、文件的输入与输出
前言👻 接口(interface)🎉 定义接口: MyInterface.cs 接口继承: InterfaceInheritance.cs C# 命名空间(Namespace)🎈 定义命名空间 using 关键字 嵌套命名空间 C# 预处理器指令🎄 C# 预处理器指令列表 #define 预处理器 条件指令 C# 正则表达式🔔 定义正则表达式 C# 异常处理🎃 语法 C# 中的异常类 异常处理 创建用户自定义异常 抛出对象 C# 文件的输入与输出⛄️ C# I/O 类 FileStream 类 C# 高级文件操作
☀️ 学会编程入门必备 C# 最基础知识介绍(六)——接口、命名空间、预处理指令、正则表达式、异常处理、文件的输入与输出
|
Java C#
C# 证明指令重排
C# 证明指令重排
4536 0