在專案開發初期,我們都會寫很多測試程式碼(Test Code)用來紀錄或顯示程式執行時期的狀態,雖然開發環境有中斷點 (Breakpoint) 可以使用,但程式部署到測試機或正式機時卻未必有開發工具可用,這時利用自己寫的測試程式碼就非常有用,但專案上線前若又需要把測試程式碼刪除頗為麻煩,今天我就打算分享一些很實務的偵錯開發技巧。
在 C# 中有個 #if 語法非常的實用,不過好像很少人在用。請先參考下圖的 Solution Configuration (方案設置) 選單,預設就有 Debug 與 Release 兩個選項可用,當專案需要建置時可以利用這兩個選項進行快速切換,以產生不同的組件輸出。
在你的程式中,可能會有以下的 Debug Code
透過 #if 語法與 #endif 語法的包夾之後,你會發現在開發環境似乎沒什麼變化
但是當你將 Solution Configuration 選單切換至 Release 之後
你就可以看見原本被 #if DEBUG 與 #endif 語法的包夾過的程式碼自動變「灰色」的了
這也代表著在將 Solution Configuration 選單切換至 Release 之後所建置 (Build) 出來的組件不會包含這些測試的程式碼,當組件部署至正式機時也完全不會影響程式執行的效率,因為 Visual Studio 在建置時 ( 或 C# 編譯器在編譯時 ) 就自動將這些 Debug Code 忽略掉。
同樣的技巧若套用在 ASP.NET Web Site (ASP.NET 網站) 專案就有點不同了,由於 ASP.NET 網站是個特殊的專案類型,執行時期所有程式碼都是動態編譯的,所以你無法利用這個技巧在 Visual Studio 開發工具中,但僅限於看到的程式碼全部都會出現灰色字而已,如下圖示:
雖然 Solution Configuration 已經切換至 Debug 項目,但程式碼中依然出現灰底字,那是因為 ASP.NET Web Site 是動態編譯的,當網站還在 Visual Studio 中程式碼尚未進行編譯(即便你按 F6 編譯也一樣),所以無法判斷目前的編譯環境。
ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的,當 compilation 的 debug 屬性設定為 true 時,動態編譯的程式碼就會自動套用 #if DEBUG 與 #endif 語法,所以即便 Visual Studio 中無法預覽目前的程式碼狀態,但實際上在執行時一樣有支援這個開發技巧。
除此之外,在 ASP.NET 中如果需要寫程式判斷目前運行的是否處於「偵錯模式」的話,也可以透過 HttpContext.IsDebuggingEnabled 屬性來判斷,如下程式範例:
if (HttpContext.Current.IsDebuggingEnabled)
{
Response.Write("<h1>DEBUG Enabled</h1>");
}
實務上判斷目前網站是否處於「偵錯模式」其實非常有用,我們可以動態針對網站進行最佳化的動作,例如自動啟用網頁內容壓縮、JavaScript 內容最小化、壓縮 CSS 檔案、刪除或關閉特定的程式記錄、…等等,至於其他運用就要靠各位的創意發想了。
相關連結