判斷提示 (或 Assert
陳述式) 會測試條件,您對 Assert
陳述式將該條件指定為引數。 如果條件評估為 True,則不會發生動作。 如果條件評估為 False,則判斷提示會失敗。 如果您是使用偵錯組建執行,您的程式會進入中斷模式。
在本主題中
System.Diagnostics 命名空間中的斷言
在 Visual Basic 和 Visual C# 中,您可以使用 Assert
方法來自 Debug 或 Trace,這兩者皆位於 System.Diagnostics 命名空間中。
Debug 類別方法不會包含在程式的 Release 版本中,因此它們不會增加大小或降低發行程式代碼的速度。
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 );
請注意,當您建立程式碼的 Release 版本時,方法的呼叫 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
時不會改變程序的結果。 否則,您可能會不小心引入只出現在程式釋出版本中的錯誤。 特別注意包含函式或過程呼叫的斷言,例如下列範例:
從表面上看,這種 System.Diagnostics.Debug.Assert 用法可能看起來很安全,但假設每次調用函式 meas 時會更新計數器。 當您建置發行版本時,會排除對 meas 的呼叫,因此計數器不會更新。 這是具有副作用的函式範例。 消除對具有副作用的函式的呼叫,可能會導致只有在正式發行版本中才會出現的錯誤。 為了避免這類問題,請勿在 System.Diagnostics.Debug.Assert 語句中放置函數調用。 請改用暫存變數:
即使您使用 System.Diagnostics.Trace.Assert,您仍可能想要避免在 Assert
語句內放置函數調用。 這類呼叫應該是安全的,因為在發行建置中System.Diagnostics.Trace.Assert敘述不會被排除。 不過,如果您習慣性地避免使用此類建構,當您使用 System.Diagnostics.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 參數
System.Diagnostics.Trace.Assert 和 System.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):
如果存在,第二個和第三個自變數必須是字串。 如果您呼叫 System.Diagnostics.Trace.Assert 或 System.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
會在條件失敗時顯示 [ 判斷提示失敗 ] 對話框。 判斷提示失敗時所發生的動作是由 Listeners 或 Listeners 屬性控制。
您可以藉由將TraceListener 物件加入Listeners
集合、從TraceListener 集合中移除Listeners
、或覆寫現有System.Diagnostics.TraceListener.Fail 的TraceListener
方法以改變其行為來自定義輸出行為。
例如,您可以覆寫 System.Diagnostics.TraceListener.Fail 方法以寫入事件記錄檔,而不是顯示 斷言失敗 對話方塊。
若要以這種方式自定義輸出,您的程式必須包含一個接聽器,並且您必須從 TraceListener 繼承並重寫其 System.Diagnostics.TraceListener.Fail 方法。
如需詳細資訊,請參閱 追蹤接聽程式。
在組態檔中設定斷言
您可以在程式組態檔和程式代碼中設定判斷提示。 如需詳細資訊,請參閱 System.Diagnostics.Trace.Assert 或 System.Diagnostics.Debug.Assert。