[.NET] 在 Debug 或 Release 時執行特定程式碼

摘要:[.NET] 在 Debug 或 Release 時執行特定程式碼

前言


當在撰寫程式的時候,在某些情況下會希望某一段程式碼只在 Debug 模式下執行而 Release 模式下不執行,例如在寫 Log 的情況下當程式佈署到正式機時,某些開發時期需要檢視的 Log 紀錄就不必寫入,以下介紹使用的方法。

 

是 Debug 或 Release ?


在這種情況下有兩種做法

  1. 使用條件指示詞 (#if)
  2. 使用 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 即可,這樣的話程式碼也變的簡潔了。

 

參考資料


#if (C# 參考)

Conditional (C# 程式設計手冊)

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)