閱讀英文

共用方式為


受控程式碼中的判斷提示

判斷提示 (或 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