共用方式為


受控程式碼中的斷言

判斷提示 (或 Assert 陳述式) 會測試條件,您對 Assert 陳述式將該條件指定為引數。 如果條件評估為 True,則不會發生動作。 如果條件評估為 False,則判斷提示會失敗。 如果您是使用偵錯組建執行,您的程式會進入中斷模式。

在本主題中

System.Diagnostics 命名空間中的斷言

Debug.Assert 方法

Debug.Assert 的副作用

追蹤和偵錯需求

Assert 自變數

自訂斷言行為

在設定檔中設置斷言

System.Diagnostics 命名空間中的斷言

在 Visual Basic 和 Visual C# 中,您可以使用 Assert 方法來自 DebugTrace,這兩者皆位於 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.AssertSystem.Diagnostics.Trace.Assert,這不會在發行版本中消失:

呼叫 System.Diagnostics.Trace.Assert 會增加發行版本的負擔,與呼叫 System.Diagnostics.Debug.Assert 不同。

本主題內容

Debug.Assert 的副作用

當您使用 System.Diagnostics.Debug.Assert 時,請確定 Assert 內的任何程式代碼在移除 Assert 時不會改變程序的結果。 否則,您可能會不小心引入只出現在程式釋出版本中的錯誤。 特別注意包含函式或過程呼叫的斷言,例如下列範例:

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

從表面上看,這種 System.Diagnostics.Debug.Assert 用法可能看起來很安全,但假設每次調用函式 meas 時會更新計數器。 當您建置發行版本時,會排除對 meas 的呼叫,因此計數器不會更新。 這是具有副作用的函式範例。 消除對具有副作用的函式的呼叫,可能會導致只有在正式發行版本中才會出現的錯誤。 為了避免這類問題,請勿在 System.Diagnostics.Debug.Assert 語句中放置函數調用。 請改用暫存變數:

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

即使您使用 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.AssertSystem.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)

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

如果存在,第二個和第三個自變數必須是字串。 如果您呼叫 System.Diagnostics.Trace.AssertSystem.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 會在條件失敗時顯示 [ 判斷提示失敗 ] 對話框。 判斷提示失敗時所發生的動作是由 ListenersListeners 屬性控制。

您可以藉由將TraceListener 物件加入Listeners 集合、從TraceListener 集合中移除Listeners、或覆寫現有System.Diagnostics.TraceListener.FailTraceListener 方法以改變其行為來自定義輸出行為。

例如,您可以覆寫 System.Diagnostics.TraceListener.Fail 方法以寫入事件記錄檔,而不是顯示 斷言失敗 對話方塊。

若要以這種方式自定義輸出,您的程式必須包含一個接聽器,並且您必須從 TraceListener 繼承並重寫其 System.Diagnostics.TraceListener.Fail 方法。

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

本主題內容

在組態檔中設定斷言

您可以在程式組態檔和程式代碼中設定判斷提示。 如需詳細資訊,請參閱 System.Diagnostics.Trace.AssertSystem.Diagnostics.Debug.Assert