首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 條件編譯指令:#if / #elif / #else / #endif / #define 控制代碼編譯

     編輯:關於C#

條件編譯指令允許在編譯階段根據符號定義決定代碼是否包含在輸出程序集中,實現「零成本」的調試/發布切換、平台差異隔離、功能開關等。本文講解語法、符號定義方式、常見場景與最佳實踐。

基礎語法

#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
}

符號定義方式

  1. 源碼中:#define SYMBOL(文件級,頂部)。
  2. 項目屬性:專案屬性 → Build → Conditional compilation symbols(如 DEBUG;TRACE;MYFEATURE),影響整個項目。
  3. 命令行編譯:csc /define:DEBUG /define:MYFEATURE Program.cs。
  4. 預定義符號:DEBUG(Debug 配置自動定義)、TRACE、NETFRAMEWORK、NETCOREAPP、NETSTANDARD 等。

常見運算符

典型應用場景

  • 調試代碼隔離:#if DEBUG ... #endif 包裹性能探測、詳細日志、斷言。
  • 平台差異:#if NET472 ... #elif NETCOREAPP3_1 ... #endif 適配不同 TFM。
  • 功能開關:#if ENABLE_NEW_UI ... #endif 灰度發布新功能。
  • 許可證/版本控制:#if TRIAL_VERSION ... #elif PRO_VERSION ... #endif。

最佳實踐

  1. 符號命名統一大寫下劃線:FEATURE_XYZ。
  2. 避免在條件編譯塊中包含過多邏輯,導致代碼可讀性下降;優先考慮運行時配置(IOptions、特性標記)。
  3. 使用 ConditionalAttribute 標記方法替代 #if 包裹調用點:[Conditional("DEBUG")] void Log(...),調用點無需修改,編譯器自動裁剪。
  4. 配合 #warning 標記待辦/棄用代碼:#warning "此方法將在 v2.0 移除,請改用 NewMethod()"。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指令含義
#if SYMBOL符號已定義則編譯后續代碼
#elif SYMBOL前條件假且當前符號定義則編譯
#else前所有條件假則編譯
#endif結束條件編譯塊
#define SYMBOL定義符號(無值,只有定義/未定義)
#undef SYMBOL取消定義
#error "msg"編譯時報錯,阻止構建
#warning "msg"編譯時警告,不阻止構建