標籤:des style http io ar os 使用 sp for
代碼協定提供一種使用代碼指定前置條件、後置條件和對象固定條件的方式。 前置條件是在輸入方法或屬性時必須滿足的要求。 後置條件描述方法或屬性代碼退出時的預期。 對象固定條件描述正常狀態下的類的預期狀態。
代碼協定包含用於標記代碼的類、用於編譯時間分析的靜態分析器和運行時分析器。 代碼協定的類可在 System.Diagnostics.Contracts 命名空間中找到。
代碼協定的優點包括:
改進測試:代碼協定提供靜態協定驗證、運行時檢查和文檔產生。
自動化的測試工具:可以使用代碼協定來篩選掉不滿足前置條件的沒有意義的測試參數,從而產生更有意義的單元測試。
靜態驗證:靜態檢查器可以在不運行程式的情況下確定是否存在任何違反協定的情況。 它會檢查隱式協定(如 null 取值 (Dereference)和數組綁定)和顯式協定。
引用文檔:文檔產生器在現有的 XML 文檔檔案增加協定資訊。 還提供了可與 Sandcastle 一起使用的樣式表,以便產生的文檔頁具有協定節。
所有 .NET Framework 語言都可以立即使用協定;您不必編寫特殊的分析器或編譯器。 利用 Visual Studio 增益集,您可以指定要執行的代碼協定分析的層級。 分析器可以確認協定的格式正確(執行類型檢查和名稱解析),並且可以使用 Microsoft 中繼語言 (MSIL) 格式產生編譯格式的協定。 通過在 Visual Studio 中創作協定,您可以利用該工具提供的標準 IntelliSense。
協定類中的大多數方法都是在一定條件下編譯的;也就是說,只有在使用 #define 指令定義特殊符號 CONTRACTS FULL 時,編譯器才會發出對這些方法的調用。 可以利用 CONTRACTS FULL 通過代碼編寫協定,而不必使用 #ifdef 指令;可以產生不同的產生,有些產生包含協定,有些不包含協定。
有關使用代碼協定的詳細說明和工具,請參見 MSDN DevLabs 網站上的e Code Contracts。
Preconditions
可以使用 Contract.Requires 方法來表示前置條件。 前置條件指定調用方法時的狀態。 它們通常用於指定有效參數值。 前置條件中提到的所有成員必須至少具有與方法本身相同的可訪問性;否則,前置條件可能不會被方法的所有調用方所理解。 該條件不得有任何負面影響。 失敗的前置條件的運行時行為由運行時分析器確定。
例如,下面的前置條件表示參數 x 必須不為 null。
Contract.Requires( x != null );
如果代碼必須在前置條件失敗時引發特定的異常,則可以使用 Requires 的泛型重載,如下所示。
Contract.Requires<ArgumentNullException>( x != null, "x" );
舊式 Requires 語句
大多數代碼都以 if-then-throw 代碼的形式包含一些參數驗證。 在以下情況下,協定工具將這些語句識別為前置條件:
當 if-then-throw 語句以這種形式出現時,則工具將這些語句識別為舊的 requires 語句。 如果 if-then-throw 序列後面沒有跟任何其他協定,則代碼以 Contract.EndContractBlock 方法結尾。
if ( x == null ) throw new ...Contract.EndContractBlock(); // All previous "if" checks are preconditions
請注意,以上測試中的條件是否定的前置條件。(實際的前置條件應是 x != null。)否定的前置條件嚴格受限:它必須如以上樣本所示那樣編寫;也就是說,它不應包含 else 子句,並且 then 子句體必須是單個 throw 語句。 if 測試受純正性和可見度規則的限制(請參見使用準則),而 throw 運算式只受純正性規則的限制。 但是,引發的異常類型必須與包含協定的方法具有相同的可見度。
Postconditions
後置條件是針對方法終止時的狀態的協定。 在即將退出方法之前檢查後置條件。 失敗的後置條件的運行時行為由運行時分析器確定。
與前置條件不同,後置條件可以引用可見度更低的成員。 用戶端可能無法理解或利用後置條件使用私人狀態表示的某些資訊,但這不會影響用戶端正確使用方法的能力。
標準後置條件
可以使用 Ensures 方法來表示標準後置條件。 後置條件表示在方法正常終止時必須為 true 的條件。
Contract.Ensures( this .F > 0 );
異常後置條件
異常後置條件是在方法引發特定異常時應為 true 的後置條件。 可以使用 Contract.EnsuresOnThrow 方法來指定這些後置條件,如以下樣本所示。
Contract.EnsuresOnThrow<T>( this.F > 0 );
該參數是每當引發作為 T 子類型的異常時必須為 true 的條件。
有些異常類型很難在異常後置條件中使用。 例如,使用 T 的類型 Exception 要求方法保證條件,而不考慮所引發的異常類型,即使異常類型為堆疊溢位或其他無法控制的異常。 應只將異常後置條件用於當調用成員時可能會引發的特定異常,例如,調用 TimeZoneInfo 方法時引發 InvalidTimeZoneException。
[轉]代碼協定