溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解.NET 4.0代碼契約組件

發(fā)布時間:2021-10-28 09:17:51 來源:億速云 閱讀:117 作者:柒染 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)如何理解.NET 4.0代碼契約組件,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

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

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

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

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

Contract.Requires( x ! = null );

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

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

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

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

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

雖然似乎在返回結(jié)果之前就指定了條件,實際它還是會在返回結(jié)果之后,調(diào)用者得到結(jié)果之前進行驗證。

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

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

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

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

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

如何理解.NET 4.0代碼契約組件

.NET契約類代碼示例

關(guān)于如何理解.NET 4.0代碼契約組件就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI