Managed 程式碼中的判斷提示
更新:2007 年 11 月
這個主題適用於:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express 版 |
||||
Standard 版 |
||||
Pro/Team 版 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
判斷提示或 Assert 陳述式可以測試條件,您可以將此條件指定為 Assert 陳述式的引數。如果評估此條件為 true,將不會發生任何動作。如果評估條件為 false,判斷提示將會失敗。如果您正使用偵錯組建來執行,您的程式將進入中斷模式。
在 Visual Basic 和 Visual C# 中,您可以從 Debug 或 Trace (在 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.Assert 以 Trace.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.Assert 和 Debug.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.Assert 或 Debug.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" );
[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 方法將在條件失敗時,顯示 [判斷提示已失敗] 對話方塊。判斷提示失敗時發生的動作將由 Listeners 或 Listeners 屬性所控制。
自訂輸出行為的方法包括了將 TraceListener 物件加入至 Listeners 集合內、從 Listeners 集合內移除 TraceListener,或覆寫現有 TraceListener 的 TraceListener.Fail 方法,以便讓它的行為有所不同。
例如,您可覆寫 TraceListener.Fail 方法以寫入事件日誌,而非顯示 [判斷提示已失敗] 對話方塊。
若要以這種方式自訂輸出,程式必須包含接聽程式,並且必須繼承自 TraceListener,並覆寫其 TraceListener.Fail 方法。
如需詳細資訊,請參閱追蹤接聽項。
在組態檔中設定判斷提示
跟程式碼一樣,您也可以在程式組態檔中設定判斷提示。如需詳細資訊,請參閱 Trace.Assert 或 Debug.Assert。