條件編譯指令允許在編譯階段根據符號定義決定代碼是否包含在輸出程序集中,實現「零成本」的調試/發布切換、平台差異隔離、功能開關等。本文講解語法、符號定義方式、常見場景與最佳實踐。
#define DEBUG_LOG // 定義符號 (必須在文件頂部、命名空間之前)
#if DEBUG_LOG
Console.WriteLine("調試日志:進入 Info() 方法");
#elif RELEASE_LOG
Logger.Info("發布版日志");
#else
// 無符號時編譯此分支
#endif
// 方法級控制示例
public string GetInfo()
{
#if (HYWORK == false)
return "can not if";
#elif (HYWORK == true)
return "do if";
#endif
}
#define SYMBOL(文件級,頂部)。DEBUG;TRACE;MYFEATURE),影響整個項目。csc /define:DEBUG /define:MYFEATURE Program.cs。DEBUG(Debug 配置自動定義)、TRACE、NETFRAMEWORK、NETCOREAPP、NETSTANDARD 等。| 指令 | 含義 |
|---|---|
#if SYMBOL | 符號已定義則編譯后續代碼 |
#elif SYMBOL | 前條件假且當前符號定義則編譯 |
#else | 前所有條件假則編譯 |
#endif | 結束條件編譯塊 |
#define SYMBOL | 定義符號(無值,只有定義/未定義) |
#undef SYMBOL | 取消定義 |
#error "msg" | 編譯時報錯,阻止構建 |
#warning "msg" | 編譯時警告,不阻止構建 |