C# 中 #if 指令的作用是什么?如何正确使用该语句?
C# #if 预处理指令说明
一、核心作用
#if 属于C#的编译时预处理指令,和运行时执行的普通if逻辑完全不同:#if的判断逻辑会在程序编译阶段完成,未命中条件的代码根本不会被编译进最终的exe/dll程序集里,完全不会占用运行时资源。
它的常见使用场景包括:
- 区分开发/生产环境:比如Debug模式下输出调试日志,Release模式下自动移除所有调试代码
- 功能版本切分:比如免费版/专业版的专属功能切换,不需要单独维护多套代码
- 跨平台兼容:针对Windows、Linux、Mac等不同系统编译对应适配代码
二、正确使用方法
使用#if的前提是先定义条件编译符号,符号可以通过三种方式定义:
- 单文件生效:在cs文件最顶部(所有
using语句之前)用#define 符号名定义 - 全局生效:右键项目 -> 选择「属性」->「生成」->「常规」-> 找到「条件编译符号」输入框,填入自定义符号,多个符号用分号分隔
- 编译时指定:使用
dotnet build命令时添加/define:符号名参数指定
基础语法示例:
// 仅当前文件生效的自定义符号 #define DEBUG_CUSTOM #define VERSION_PRO using System; public class Demo { public static void Run() { #if DEBUG_CUSTOM // 只有定义了DEBUG_CUSTOM时,这段代码才会被编译 Console.WriteLine("调试模式:输出运行参数"); #elif VERSION_PRO // 未定义DEBUG_CUSTOM但定义了VERSION_PRO时,编译这段代码 Console.WriteLine("专业版:解锁全部功能"); #else // 以上两个符号都未定义时,编译这段代码 Console.WriteLine("普通版:基础功能可用"); #endif // #endif 之外的代码不受条件控制,始终会被编译 Console.WriteLine("程序执行完成"); } }
官方已经预置了一批常用的全局符号,不需要手动定义就能直接使用:比如DEBUG(Debug编译配置自动携带,Release配置自动移除)、.NET版本相关的NET6_0/NET7_0、操作系统相关的WINDOWS/LINUX等。
你提供的代码示例就是最常见的DEBUG符号使用场景:
这个写法可以保证Debug调试时执行额外的校验代码,正式发布的Release版本里自动移除校验逻辑,不影响运行性能。
三、注意事项
#if只能判断编译阶段就能确定的符号,不能使用运行时的变量作为判断条件- 未命中的
#if代码块就算存在语法错误,编译时也不会报错,修改编译条件后建议全量编译校验所有分支的语法正确性 - 单个文件顶部用
#define定义的符号仅对当前文件生效,需要全项目生效的符号建议在项目属性中配置
内容的提问来源于stack exchange,提问作者user8630414
相关产品推荐
相关产品推荐

