受控程式碼中的判斷提示

判斷提示 (或 Assert 陳述式) 會測試條件,您對 Assert 陳述式將該條件指定為引數。 如果條件評估為 True,則不會發生動作。 如果條件評估為 False,則判斷提示會失敗。 如果您是使用偵錯組建執行,您的程式會進入中斷模式。

本主題內容

System.Diagnostics 命名空間中的判斷提示

Debug.Assert 方法

Debug.Assert 的副作用

追蹤和偵錯需求

Assert 引數

自訂 Assert 的行為

在組態檔中設定判斷提示

System.Diagnostics 命名空間中的判斷提示

在 Visual Basic 和 Visual C# 中,您可以從位於 Assert 命名空間中的 DebugTrace 使用 System.Diagnostics 方法。 Debug 類別方法未包含在程式的發行版本中,因此不會增加發行程式碼的大小或減緩其速度。

C++ 不支援 Debug 類別方法。 您可以使用 Trace 類別搭配條件式編譯得到相同的效果,例如 #ifdef DEBUG... #endif

本主題內容

Debug.Assert 方法

您可以隨意使用 System.Diagnostics.Debug.Assert 方法測試程式碼正確時應為 true 的條件。 例如,假設您撰寫了整數除法函式。 根據數學的規則,除數不得為零。 您可以使用判斷提示測試這項條件:

int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

您在偵錯工具下執行此程式碼時,將會評估判斷提示陳述式,但是在發行版本中則不會進行比較,因此不會有額外的負荷。

以下是另一個範例。 您擁有實作檢查帳戶的類別,如下所示:

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

在您從帳戶中提領現金之前,要先確定帳戶餘額足夠供應您預備提領的金額。 您可以撰寫判斷提示檢查餘額:

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

請注意,當您建立程式碼的發行版本時,對 System.Diagnostics.Debug.Assert 方法的呼叫就會消失。 這表示,在發行版本內,檢查餘額的呼叫將會消失。 若要解決這個問題,您應該將 System.Diagnostics.Debug.Assert 取代為 System.Diagnostics.Trace.Assert,後者不會在發行版本中消失:

呼叫 System.Diagnostics.Trace.Assert 與呼叫 System.Diagnostics.Debug.Assert 不同,前者會增加發行版本的額外負荷。

本主題內容

Debug.Assert 的副作用

當您使用 System.Diagnostics.Debug.Assert 時,確定 Assert 內的任何程式碼都不會在 Assert 移除後變更程式的結果。 否則,您可能意外引入只會出現在程式發行版本中的 Bug。 處理包含函式或程序呼叫的判斷提示時要特別小心,例如下面的範例:

// unsafe code
Debug.Assert (meas(i) != 0 );

這個 System.Diagnostics.Debug.Assert 用法乍看之下好像很安全,但假設每次呼叫 meas 函式時都會更新計數器。 當您建置發行版本時,將會去除這個 meas 呼叫,如此計數器就不會更新。 這是具有副作用的函式範例。 去除具有副作用的函式呼叫將導致只出現在發行版本中的 Bug。 若要避免此類問題,請不要在 System.Diagnostics.Debug.Assert 陳述式中放置函式呼叫。 請改用暫存變數:

temp = meas( i );
Debug.Assert ( temp != 0 );

即使是使用 System.Diagnostics.Trace.Assert 時,您仍然會想要避免將函式呼叫放入 Assert 陳述式中。 此類呼叫應該是安全的,因為發行組建中不會去除 System.Diagnostics.Trace.Assert 陳述式。 但是,如果您養成不使用此類建構的習慣,使用 System.Diagnostics.Debug.Assert 時就比較不會犯錯。

本主題內容

追蹤和偵錯需求

如果您使用 Visual Studio 精靈建立專案,根據預設,TRACE 符號會同時在發行和偵錯組態中定義。 根據預設,DEBUG 符號只會在偵錯組建中定義。

否則為了要讓 Trace 方法運作,您程式的原始程式檔頂端就必須要有下列其中一個項目:

  • #Const TRACE = True (在 Visual Basic 中)

  • Visual C# 及 C++ 中的 #define TRACE

    或者,您的程式必須是使用 TRACE 選項所建置:

  • /d:TRACE=True (在 Visual Basic 中)

  • Visual C# 及 C++ 中的 /d:TRACE

    如果您需要在 C# 或 Visual Basic 的發行組建中使用 Debug 方法,則必須在發行組態中定義 DEBUG 符號。

    C++ 不支援 Debug 類別方法。 您可以使用 Trace 類別搭配條件式編譯得到相同的效果,例如 #ifdef DEBUG... #endif。 您可以在 [<專案> 屬性頁] 對話方塊中定義這些符號。 如需詳細資訊,請參閱變更 Visual Basic 偵錯組態的專案設定變更 C 或 C++ 偵錯組態的專案設定

Assert 引數

System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert 最多可接受三個引數。 第一個引數是強制性的,代表您要檢查的條件。 如果您只使用一個引數呼叫 System.Diagnostics.Trace.Assert(Boolean)System.Diagnostics.Debug.Assert(Boolean)Assert 方法將會檢查該條件,而如果結果為 false,則會將呼叫堆疊的內容輸出至 [輸出] 視窗。 下列範例將示範 System.Diagnostics.Trace.Assert(Boolean)System.Diagnostics.Debug.Assert(Boolean)

Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );

若出現第二個和第三個引數,這兩個引數必須為字串。 如果您使用兩個或三個引數呼叫 System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert,第一個引數就是條件。 方法會檢查條件,如果結果是 false,就會輸出第二個和第三個字串。 下列範例將示範搭配兩個引數使用的 System.Diagnostics.Debug.Assert(Boolean, String)System.Diagnostics.Trace.Assert(Boolean, String)

Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

下列範例將示範搭配三個引數使用的 System.Diagnostics.Debug.Assert(Boolean, String, String)System.Diagnostics.Trace.Assert(Boolean, String, String)

Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

本主題內容

自訂 Assert 的行為

如果您以使用者介面模式執行應用程式,Assert 方法將在條件失敗時顯示 [判斷提示失敗] 對話框。 判斷提示失敗時發生的動作是由 ListenersListeners 屬性所控制。

自訂輸出行為的方法包括將 TraceListener 物件加入至 Listeners 集合內、從 TraceListener 集合內移除 Listeners,或覆寫現有 System.Diagnostics.TraceListener.FailTraceListener 方法,讓它擁有不同的行為。

例如,您可以覆寫 System.Diagnostics.TraceListener.Fail 方法以寫入事件記錄檔,而非顯示 [判斷提示失敗] 對話方塊。

若要以這種方式自訂輸出,您的程式必須包含接聽程式,而且必須繼承自 TraceListener,並覆寫其 System.Diagnostics.TraceListener.Fail 方法。

如需詳細資訊,請參閱追蹤接聽項

本主題內容

在組態檔中設定判斷提示

您可以在程式組態檔中設定判斷提示,就像在程式碼中一樣。 如需詳細資訊,請參閱 System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert