Share via


Managed 程式碼中的判斷提示

判斷提示或 Assert 陳述式可以測試條件,您可以將此條件指定為 Assert 陳述式的引數。 如果評估此條件為 true,將不會發生任何動作。 如果評估條件為 false,判斷提示將會失敗。 如果您正使用偵錯組建來執行,您的程式將進入中斷模式。

本主題內容

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

Debug.Assert 方法

Debug.Assert 副作用

Trace 和 Debug 需求

判斷提示引數

自訂判斷提示行為

在組態檔中設定判斷提示

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

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

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

本主題內容

Debug.Assert 方法

您可隨意地使用 Debug.Assert 方法,測試程式碼正確時應為 true 的條件。 例如,假設您寫好一個整數除法的函式。 依數學規則,除數不可為零。 您可使用一個判斷提示來測試此狀況:

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function
int IntegerDivide ( int dividend , int divisor )
    { Debug.Assert ( divisor != 0 );
        return ( dividend / divisor ); }

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

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

Dim amount, balance As Double
balance = savingsAccount.balance
Debug.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

在您從帳戶中提領現金之前,必須確認帳戶餘額足夠供應您預備提領的金額。 您可編寫一個判斷提示來檢查餘額:

Dim amount, balance As Double
balance = savingsAccount.balance
Trace.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

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

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

本主題內容

Debug.Assert 副作用

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

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

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

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

即使當您使用 Trace.Assert 時,仍然想要避免將函式呼叫放置在 Assert 陳述式內。 這類呼叫應該是安全的,因為 Trace.Assert 陳述式並不會排除在發行組建之外。 但是,若您養成不使用這類的建構習慣,就比較不會在使用 Debug.Assert 時發生錯誤。

本主題內容

Trace 和 Debug 需求

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

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

  • 在 Visual Basic 中的 #Const TRACE = True

  • 在 Visual C# 和 C++ 中的 #define TRACE

或者程式必須是用 TRACE 選項來建置:

  • 在 Visual Basic 中的 /d:TRACE=True

  • 在 Visual C# 和 C++ 中的 /d:TRACE

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

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

判斷提示引數

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

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

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

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

下列範例會示範 AssertAssert

Debug.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:", "inctemp failed on third call" )
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" ); 

本主題內容

自訂判斷提示行為

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

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

例如,您可覆寫 TraceListener.Fail 方法以寫入事件日誌,而非顯示 [判斷提示已失敗] 對話方塊。

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

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

本主題內容

在組態檔中設定判斷提示

跟程式碼一樣,您也可以在程式組態檔中設定判斷提示。 如需詳細資訊,請參閱Trace.AssertDebug.Assert

請參閱

工作

HOW TO:使用追蹤和偵錯進行條件式編譯

參考

Debug.Assert

Trace.Assert

概念

偵錯工具安全性

其他資源

追蹤和稽核應用程式

偵錯準備:C#、F# 和 Visual Basic 專案類型

偵錯 Managed 程式碼