程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 詳解.NET 4.0代碼契約組件

詳解.NET 4.0代碼契約組件

編輯:關於.NET

代碼契約組件是對.NET的重要補充,這次我們將提供更為詳細的內容。

如果要在.NET 4.0發布之前使用代碼契約,我們可以在Visual Studio項目中引用程序集 Microsoft.Contracts.dll,該程序集安裝在%PROGRAMFILES%/Microsoft/Contracts/PublicAssemblies目 錄下。.NET 4.0會在mscorlib.dll中包含契約組件。我們可以指定契約驗證,可在編譯時(靜態)或在運 行時(動態)執行校驗。

契約包含幾種類型:前置條件(Preconditions)、後置條件(Postconditions)、對象不變量 (Object Invariants)、斷言(Assertions)、假定(Assumptions)、量詞(Quantifiers)、接口契 約(Interface Contracts)和抽象方法契約(Abstract Method Contracts)。

前置條件使用Contract.Requires()進行定義,如果在編譯時使用了符號(Symbol)CONTRACTS_FULL或 CONTRACTS_PRECONDITIONS,那麼IL中就會包含其編譯結果。例如:

Contract.Requires( x ! = null );

如下所示,前置條件通常作為方法體中的參數驗證,如下所示:

public Rational( int numerator, int denominator)
{  Contract.Requires(  denominator ! = 0 );
   this .numerator = numerator;
   this  .denominator = denominator;
}

如果不符合Contract.Requires()指定的條件,就會調用Debug.Assert(false),然後調用 Environment.FailFast()。如果不管在編譯時使用哪個符號,您都希望程序集中包含前置條件,那麼可以 使用Contract.RequiresAlways()。

當方法結束時,後置條件表示其結果需要滿足的契約。它通過Contract.Ensures()方法指定,如下例 所示:

public int Denominator {
  get {
     Contract.Ensures(  Contract.Result() != 0 );
     return this .denominator;
    }
}

雖然似乎在返回結果之前就指定了條件,實際它還是會在返回結果之後,調用者得到結果之前進行驗 證。

對象不變量則為每個實例指定條件。

ContractInvariantMethod]protected void ObjectInvariant () {
Contract.  Invariant ( this .denominator ! = 0 );
  }

至於其他類型的契約,斷言表示為Contract.Assert(),假定則表示為Contract.Assume()。一個失敗 的Assert()會調用Debug.Assert(false)。假定與運行時斷言相似,不同之處在於靜態檢驗的方式。假定 用於指定“期望”應該符合的條件,而由於某些限制,該條件無法得到編譯器的驗證。

接口契約為接口指定條件。它們使用在關聯於接口的獨立類上,因為接口方法只能聲明,而不能擁有 方法體。對於抽象方法契約同樣如此。

以下為一個使用契約的類:

.NET契約類代碼示例

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved