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

CLR 4.0中的代碼契約

編輯:關於.NET

代碼契約來自於微軟的研究項目TEAM, 理念是”契約式設計”. 過去我們寫一些方法, 在每一個方法 前面加上說明文字, 告訴調用者這些方法的參數有什麼要求. 但是這樣做有一個缺點, 就是這樣不能使調 用者必須遵守調用要求. CLR4.0提供的代碼契約機制可以保證調用者遵守這些調用規則, 編譯時有編譯器 進行檢查, 運行時有CLR來檢查. 它類似於c++的斷言機制. 但比c++的更豐富.

所有的代碼契約都在 System.Diagnostics.Contracts.CodeContract靜態類中定義. 來看幾個常用的 :

方法體剛進入時用:

CodeContract.Requires(x>= 0);  明眼人一看就懂,  它受編譯開關的影響, 比如你可以只在調 試模式下使用此代碼契約.

CodeContract.RequiresAlways(x>= 0); 基本和上面這個一樣, 唯一區別它不受編譯開關的影響, 即不管是Debug還是Release模式都要包括這個代碼契約.

方法體退出時用(這些須寫在方法體的開始處):

// 方法體關閉時必須為真 must be true if method closes successfully 
CodeContract.Ensures(z != null);
// 確保發生異常時某些變量的狀態 Grantuee some  variable status in 
CodeContract.EnsuresOnThrow(z !=  null);case of specific exceptions.

對象不變量

對象不變量確保所有公共方法返回時某些條件必須滿足. 對象不變量定義在一個單獨的方法內, 此方 法要有[ContractInvariantMethod]做標注. 方法名無所謂, 但是方法必須返回void, 並且沒有參數, 方 法體內可以有多個CodeContract.Invariant語句, 如:

[ContractInvariantMethod]

  void ObjectInvariant() { 
CodeContract.Invariant(someData >= 0); 
}

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