.NET 预处理器指令

  • C# 预处理器指令
     虽然编译器没有单独的预处理器,但在处理该节中描述的指令时如同存在一个单独的预处理器;这些指令用于辅助条件编译。 与 C 和 C++ 指令不同,不能使用这些指令创建宏。预处理器指令必须是行上的唯一指令。
  • #if
     如果 C# 编译器遇到最后面跟有 #endif 指令的 #if 指令,则仅当指定的符号已定义时,它才会编译这两个指令之间的代码。 与 C 和 C++ 不同,您不能对符号赋予数值;C# 中的 #if 语句是 Boolean,仅测试符号是否已定义。
    • 代码示例
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#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");
#endif
    }
}
  • #else
     #else 允许您创建复合条件指令,因此,如果前面的 #if 或(可选)#elif 指令中的任何表达式都不为 true,则编译器将计算 #else 与后面的 #endif 之间的所有代码。
  • #elif
     #elif 使您得以创建复合条件指令。 如果前导 #if(C# 参考) 和任何可选前导 #elif 指令表达式的计算结果都不是 true,则将计算 #elif 表达式。 如果 #elif 表达式计算为 true,编译器将计算位于 #elif 和下一个条件指令之间的所有代码。
  • #endif
     #endif 指定以 #if 指令开头的条件指令的结尾。
  • # define
     #define 可让您定义符号。 当您将符号用作传递给 #if 指令的表达式时,此表达式的计算结果为 true。不能像在 C 和 C++ 中的通常做法一样,使用 #define 指令来声明常数值。最好是将 C# 中的常数定义为类或结构的静态成员。如果具有多个像这样的常数,可以考虑创建一个单独的“Constants”类来保存这些常数。
  • #undef
     #undef 使您可以取消符号的定义,以便通过将该符号用作 #if 指令中的表达式,使表达式的计算结果为 false。
可以使用 #define 指令或 /define 编译器选项定义符号。 在使用任何不是指令的语句之前,必须在文件中使用 #undef 指令。
    • 代码示例
#undef DEBUG
using System;
class MyClass 
{
    static void Main() 
    {
#if DEBUG
        Console.WriteLine("DEBUG is defined");
#else
        Console.WriteLine("DEBUG is not defined");
#endif
    }
}
  • #warning
     #warning 使您得以从代码的特定位置生成一级警告。#warning 通常用在条件指令中。也可以用 #error生成用户定义的错误。
    • 代码示例
#define DEBUG
class MainClass 
{
    static void Main() 
    {
#if DEBUG
#warning DEBUG is defined
#endif
    }
}
  • #error
     #error 使您可以从代码中的特定位置生成错误。#error 通常用在条件指令中。
    • 代码示例
#define DEBUG
class MainClass 
{
    static void Main() 
    {
#if DEBUG
#error DEBUG is defined
#endif
    }
}
  • #line
     #line 使您可以修改编译器的行号以及(可选)错误和警告的文件名输出。 下面的示例说明如何报告与行号关联的两个警告。 #line 200 指令将行号强制设置为 200(尽管默认行号为 #7),在执行下一条 #line 指令之前,文件名将报告为“Special”。 #line default 指令将行号恢复为默认行号,默认行号对前一条指令重新编号的行进行计数。
    • 代码示例
class MainClass
{
    static void Main()
    {
#line 200 "Special"
        int i;    // CS0168 on line 200
        int j;    // CS0168 on line 201
#line default
        char c;   // CS0168 on line 9
        float f;  // CS0168 on line 10
#line hidden // numbering not affected
        string s; 
        double d; // CS0168 on line 13
    }
}
  • #region
     #region 使您可以在使用 Visual Studio 代码编辑器的大纲显示功能时指定可展开或折叠的代码块。 在较长的代码文件中,能够折叠或隐藏一个或多个区域会十分便利,这样,您可将精力集中于当前处理的文件部分。 #region 块必须以 #endregion 指令终止。#region 块不能与 #if 块重叠。但是,可以将 #region 块嵌套在 #if 块内,或将 #if 块嵌套在 #region 块内。
    • 代码示例
#region MyClass definition
public class MyClass 
{
    static void Main() 
    {
    }
}
#endregion
  • #endregion
     #endregion 标记 #region 块的结尾。
  • #pragma
     #pragma 为编译器提供特殊的指令,以说明如何编译包含杂注的文件。 这些指令必须是编译器支持的指令。 也就是说,不能使用 #pragma 创建自定义预处理指令。
    • 代码示例
#pragma pragma-name pragma-arguments
  • #pragma warning
     #pragma warning 可启用或禁用某些警告。
    • 代码示例
#pragma warning disable warning-list
#pragma warning restore warning-list
  • #pragma checksum
     生成源文件的校验和,以帮助调试 ASP.NET 页。
    • 代码示例
#pragma checksum "filename" "{guid}" "checksum bytes"

标签