共用方式為


Managed 程式碼中的判斷提示

更新:2007 年 11 月

這個主題適用於:

版本

Visual Basic

C#

C++

Web Developer

Express 版

標題適用於 標題適用於 標題不適用於 標題適用於

Standard 版

標題適用於 標題適用於 標題不適用於 標題適用於

Pro/Team 版

標題適用於 標題適用於 標題不適用於 標題適用於

表格圖例:

標題適用於

套用

標題不適用於

不套用

預設會套用主題但隱藏命令

預設隱藏的命令。

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

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

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

Debug.Assert 方法

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

[Visual Basic]

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function

[C#]

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

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

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

[Visual Basic]

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

[C#]

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

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

[Visual Basic]

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

[C#]

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 移除後變更程式的結果。否則,您可能意外地引入只會出現在程式發行版本中的錯誤。在處理包含函式或程序呼叫的判斷提示時要特別小心,例如下面的範例:

[Visual Basic]

' unsafe code
Debug.Assert (meas(i) <> 0 )

[C#]

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

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

[Visual Basic]

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

[C#]

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++ 偵錯組態的專案設定

Assert 引數

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

[Visual Basic]

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

[C#]

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

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

[Visual Basic]

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

[C#]

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

下列範例會示範 AssertAssert

[Visual Basic]

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" )

[C#]

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# 和 Visual Basic 專案類型

偵錯 Managed 程式碼