承接上篇文章,本文將介紹 #warning/#error、#region/#endregion、#line 以及 #pragma 系列指令的進階用法。
發出編譯警告,不中斷編譯流程,常用於提醒待辦事項:
#warning "別忘了移除這段測試代碼!"
Visual Studio 會在錯誤清單中以黃色警告圖示標示,滑鼠懸停可見完整訊息。
發出編譯錯誤,立即中止編譯,不產生 IL 代碼,常用於防護性檢查:
#if DEBUG && RELEASE
#error "不可同時定義 DEBUG 與 RELEASE!"
#endif
#if DEBUG && RELEASE
#error "You've defined both DEBUG and RELEASE!"
#endif
#warning "Don't forget to remove this temporary code!"
Console.WriteLine("I have this job");
將程式碼區塊標記為可摺疊的命名區域,**不影響編譯**,僅供 IDE (Visual Studio) 識別:
#region 私有欄位
private int x;
private int y;
#endregion
#region 公用屬性
public int X { get; set; }
public int Y { get; set; }
#endregion
善用此指令可大幅提升大型檔案的可讀性與導航效率。
當原始碼經過預處理工具轉換 (如程式碼產生器、模板引擎) 後,原始行號與檔案名可能失真。#line 可修正編譯器回報的錯誤/警告位置:
#line 164 "Core.cs" // 指定下一行為 Core.cs 第 164 行
// 產生的代碼...
#line default // 恢復預設行號追蹤
精細控制特定警告的啟用/停用,作用範圍可精確到類別或方法層級:
#pragma warning disable 169 // 停用 CS0169 (欄位未被使用)
public class MyClass
{
int unusedField; // 此處不會產生警告
}
#pragma warning restore 169 // 恢復預設行為
優於命令列選項 /nowarn 的全域關閉方式。
為原始檔產生檢查和,協助 ASP.NET 頁面偵錯:
#pragma checksum "MyFile.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "CRC32检验和值"
| 指令 | 用途 |
|---|---|
| #if / #elif / #else / #endif | 條件編譯區塊 |
| #define / #undef | 定義/移除條件編譯符號 |
| #warning / #error | 編譯期警告/錯誤 |
| #line | 控制行號與檔案名顯示 |
| #region / #endregion | 程式碼摺疊區域 |
| #pragma warning | 精細控制警告 |
| #pragma checksum | 原始檔檢查和 |