C# 预处理器指令详解

📅 2026/7/11 7:03:25
C# 预处理器指令详解
C#预处理器指令Preprocessor Directives是以#开头的特殊命令它们不会生成 IL中间语言代码而是在编译之前由编译器处理用来控制代码是否参与编译、定义符号、输出警告等。与 C/C 不同C# 的预处理器不能进行宏替换没有#define MAX 100这种功能。一、什么是预处理器指令例如#define DEBUG using System; class Program { static void Main() { #if DEBUG Console.WriteLine(调试模式); #endif Console.WriteLine(程序结束); } }输出调试模式 程序结束如果没有定义DEBUG// #define DEBUG那么#if DEBUG Console.WriteLine(调试模式); #endif整个代码块不会参与编译。二、C# 常见预处理器指令指令作用#define定义编译符号#undef取消定义#if条件编译#elif否则如果#else否则#endif结束条件编译#warning生成编译警告#error生成编译错误#region折叠代码区域#endregion结束区域#line修改行号信息#nullable控制可空引用类型#pragma控制编译器行为三、#define用于定义一个编译符号。语法#define 名称例如#define TEST using System; class Program { static void Main() { #if TEST Console.WriteLine(测试模式); #endif } }输出测试模式注意必须放在文件最顶部不能放到 namespace 内一个文件定义仅影响当前文件错误示例using System; #define TEST编译错误。四、#undef取消定义。例如#define TEST #undef TEST using System; class Program { static void Main() { #if TEST Console.WriteLine(测试); #else Console.WriteLine(正式); #endif } }输出正式五、#if 条件编译最常见。例如#define DEBUG using System; class Program { static void Main() { #if DEBUG Console.WriteLine(Debug版本); #endif #if RELEASE Console.WriteLine(Release版本); #endif } }输出Debug版本多条件可以使用#if DEBUG TEST例如#define DEBUG #define TEST #if DEBUG TEST Console.WriteLine(两个都存在); #endif也支持#if DEBUG || TEST以及#if !DEBUG六、#elif例如#define WINDOWS #if LINUX Console.WriteLine(Linux); #elif WINDOWS Console.WriteLine(Windows); #else Console.WriteLine(Unknown); #endif输出Windows七、#else例如#if DEBUG Console.WriteLine(调试); #else Console.WriteLine(发布); #endif八、#endif结束一个条件块。例如#if DEBUG ... #endif九、#warning人为生成一个编译警告。例如#warning 这里还有BugVisual Studiowarning CS1030: 这里还有Bug程序仍然可以运行。十、#error人为生成编译错误。例如#error 当前版本禁止发布结果error CS1029: 当前版本禁止发布程序无法编译。适合禁止旧版本禁止错误配置提醒开发人员十一、#region用于代码折叠。例如#region 字段 private int age; private string name; #endregionIDE 中显示▶ 字段点击即可展开。也可以#region 属性 ... #endregion #region 方法 ... #endregion大型项目大量使用。十二、#line修改编译器认为的行号。例如#line 100 Console.WriteLine(Hello);如果这里报错第100行而不是实际行号。也可以#line hidden隐藏行号。恢复#line default通常用于代码生成器RazorT4 模板十三、#nullableC# 8.0控制可空引用类型。开启#nullable enable string? name null;关闭#nullable disable恢复默认#nullable restore例如#nullable enable string name null;编译器警告 不能赋值 null而string? name null;没有警告。十四、#pragma控制编译器行为。最常见#pragma warning disable例如#pragma warning disable CS0168 int a; #pragma warning restore CS0168表示关闭变量声明但未使用之后恢复。也可以#pragma warning disable CS0618关闭过时 API十五、实际开发中的应用1. Debug 日志#if DEBUG Console.WriteLine(开始执行); #endifRelease 不会编译。2. 平台区分#if WINDOWS ... #elif LINUX ... #endif3. 测试代码#if TEST RunUnitTest(); #endif上线自动去除。4. API 版本控制#if NET8_0 ... #elif NET6_0 ... #endif.NET SDK 会自动定义目标框架对应的编译符号。5. 临时屏蔽警告#pragma warning disable CS0618 OldMethod(); #pragma warning restore CS0618十六、注意事项❌ 错误示例#define MAX 100C# 不支持宏替换。只能#define DEBUG不能#define Version 1.0十七、与 C/C 的区别功能C#C/C宏替换❌ 不支持✅ 支持条件编译✅ 支持✅ 支持包含文件#include❌ 不支持✅ 支持定义符号✅ 支持✅ 支持代码折叠✅#region部分编辑器支持生成警告✅✅十八、常用预处理器指令速查指令说明是否常用#define定义编译符号⭐⭐⭐⭐⭐#undef取消定义⭐⭐⭐#if条件编译⭐⭐⭐⭐⭐#elif条件分支⭐⭐⭐⭐#else条件分支⭐⭐⭐⭐#endif结束条件编译⭐⭐⭐⭐⭐#warning生成编译警告⭐⭐⭐#error生成编译错误⭐⭐⭐#region代码折叠⭐⭐⭐⭐⭐#endregion结束代码区域⭐⭐⭐⭐⭐#line修改行号信息⭐⭐#nullable控制可空引用类型⭐⭐⭐⭐#pragma控制编译器行为⭐⭐⭐⭐总结预处理器指令的主要用途是在编译阶段控制代码而不是在程序运行时改变逻辑。其中日常开发最常用的是#if / #elif / #else / #endif根据编译符号实现条件编译。#region / #endregion组织和折叠代码提高可读性。#nullable启用或控制可空引用类型检查减少空引用异常。#pragma warning临时关闭或恢复特定编译警告。掌握这些指令后你可以更灵活地管理不同编译配置如 Debug/Release、跨平台代码以及大型项目的代码结构。