摘要:[.NET] 在 Debug 或 Release 時執行特定程式碼
前言
當在撰寫程式的時候,在某些情況下會希望某一段程式碼只在 Debug 模式下執行而 Release 模式下不執行,例如在寫 Log 的情況下當程式佈署到正式機時,某些開發時期需要檢視的 Log 紀錄就不必寫入,以下介紹使用的方法。
是 Debug 或 Release ?
在這種情況下有兩種做法
- 使用條件指示詞 (#if)
- 使用 Conditional 屬性
首先如果使用條件指示詞的做法,假設有一個建訂單的方法如下,會寫入兩種 Log
public bool WorkMethod(Order order)
{
DebugLog(order.GetPropInfo()); // 寫入偵錯資訊
var result = CreateOreder(order);
if (result.IsSuccess)
return true;
else
{
FailedLog(result.Message); // 寫入失敗資訊
}
}
public void DebugLog(string message)
{
// do something...
}
public void FailedLog(string message)
{
// do something...
}
在 DebugLog() 方法目的是用來記錄傳入的 Order 物件的屬性資料來偵錯使用,而 FailedLog() 方法則是記錄實際失敗的資訊,現在如果想在佈署正式機時不要寫入偵錯資訊,則可以加入條件指示詞來判斷,如下
#if DEBUG
DebugLog(order.GetPropInfo()); // 寫入偵錯資訊
#endif
並且當切換方案組態的建置類型是 Debug 或 Release 時,可以發現在 VS 中當設定為 Release 時,該段程式碼將變詼諧
Debug Mode
Release Mode
但是其實使用條件指示詞來判斷 Debug 或 Release 並不是很好的做法,因為這樣做會造成程式裡到處都是 #if DEBUG....當之後要調整時遺漏改到就會有問題,為了避免這種情況就可以使用第二種方式來處理。
使用 ConditionalAttribute 屬性來處理,只需要在想要 Release 模式下不執行的方法上加入此 Attribute 即可,如下
public bool WorkMethod(Order order)
{
DebugLog(order.GetPropInfo()); // 寫入偵錯資訊
var result = CreateOreder(order);
if (result.IsSuccess)
return true;
else
{
FailedLog(result.Message); // 寫入失敗資訊
}
}
[Conditional("DEBUG")]
public void DebugLog(string message)
{
// do something...
}
public void FailedLog(string message)
{
// do something...
}
如此當此方法在 Release 時也要執行時,只要修改此 Attribute 即可,這樣的話程式碼也變的簡潔了。
參考資料
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)