Managed 程式碼中的判斷提示
判斷提示 (或 Assert 陳述式) 可以測試條件,您可以將此條件指定為 Assert 陳述式的引數。 如果條件判斷值為 true,則不會執行任何動作。 如果條件判斷值為 false,則判斷提示會失敗。 如果您是以偵錯組建執行,則您的程式將進入中斷模式。
本主題內容
System.Diagnostics 命名空間中的判斷提示
Debug.Assert 方法
Debug.Assert 的副作用
追蹤和偵錯需求
Assert 引數
自訂 Assert 的行為
在組態檔中設定判斷提示
System.Diagnostics 命名空間中的判斷提示
在 Visual Basic 和 Visual C# 中,您可以從位於 System.Diagnostics 命名空間中的 Debug 或 Trace 使用 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.Assert 取代為 Trace.Assert,後者不會在發行版本中消失:
呼叫 Trace.Assert 與呼叫 Debug.Assert 不同,前者會增加發行版本的額外負荷。
本主題內容
Debug.Assert 的副作用
當您使用 Debug.Assert 時,請確認 Assert 內的任何程式碼都不會在 Assert 移除後變更程式的結果。 否則,您可能意外引入只會出現在程式發行版本中的 Bug。 處理包含函式或程序呼叫的判斷提示時要特別小心,例如下面的範例:
' unsafe code
Debug.Assert (meas(i) <> 0 )
// unsafe code
Debug.Assert (meas(i) != 0 );
這個 Debug.Assert 用法乍看之下好像很安全,但假設每次呼叫 meas 函式時都會更新計數器。 當您建置發行版本時,將會去除這個 meas 呼叫,如此計數器就不會更新。 這是具有副作用的函式範例。 去除具有副作用的函式呼叫將導致只出現在發行版本中的 Bug。 若要避免這類問題,請不要在 Debug.Assert 陳述式中放置函式呼叫。 請改用暫存變數:
temp = meas( i )
Debug.Assert (temp <> 0)
temp = meas( i );
Debug.Assert ( temp != 0 );
即使是使用 Trace.Assert 時,您仍然會想要避免將函式呼叫放入 Assert 陳述式中。 這類呼叫應該是安全的,因為發行組建中不會去除 Trace.Assert 陳述式。 但是,如果您養成不使用這類建構的習慣,使用 Debug.Assert 時就比較不會犯錯。
本主題內容
追蹤和偵錯需求
如果您使用 Visual Studio 精靈建立專案,根據預設,TRACE 符號會同時在發行和偵錯組態中定義。 根據預設,DEBUG 符號只會在偵錯組建中定義。
否則為了要讓 Trace 方法運作,您程式的原始程式檔頂端就必須要有下列其中一個項目:
#Const TRACE = True (在 Visual Basic 中)
#define TRACE (在 Visual C# 和 C++ 中)
或者,您的程式必須是使用 TRACE 選項所建置:
/d:TRACE=True (在 Visual Basic 中)
/d:TRACE (在 Visual C# 和 C++ 中)
如果您需要在 C# 或 Visual Basic 的發行組建中使用 Debug 方法,則必須在發行組態中定義 DEBUG 符號。
C++ 不支援 Debug 類別方法。 您可以使用 Trace 類別搭配條件式編譯得到相同的效果,例如 #ifdef DEBUG... #endif. 您可以在 [<專案> 屬性頁] 對話方塊中定義這些符號。 如需詳細資訊,請參閱變更 Visual Basic 偵錯組態的專案設定或變更 C 或 C++ 偵錯組態的專案設定。
Assert 引數
Trace.Assert 和 Debug.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.Assert 或 Debug.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" );
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 的行為
如果您以使用者介面模式執行應用程式,Assert 方法將在條件失敗時顯示 [判斷提示失敗] 對話方塊。 判斷提示失敗時發生的動作是由 Listeners 或 Listeners 屬性所控制。
自訂輸出行為的方法包括將 TraceListener 物件加入至 Listeners 集合內、從 Listeners 集合內移除 TraceListener,或覆寫現有 TraceListener 的 TraceListener.Fail 方法,讓它擁有不同的行為。
例如,您可以覆寫 TraceListener.Fail 方法以寫入事件記錄檔,而非顯示 [判斷提示失敗] 對話方塊。
若要以這種方式自訂輸出,您的程式必須包含接聽程式,而且必須繼承自 TraceListener,並覆寫其 TraceListener.Fail 方法。
如需詳細資訊,請參閱追蹤接聽項。
本主題內容
在組態檔中設定判斷提示
您可以在程式組態檔中設定判斷提示,就像在程式碼中一樣。 如需詳細資訊,請參閱 Trace.Assert 或 Debug.Assert。