探秘CLR 4.0中的代碼契約
代碼契約來自于微軟的研究項(xiàng)目TEAM, 理念是”契約式設(shè)計(jì)”. 過去我們寫一些方法, 在每一個(gè)方法前面加上說明文字, 告訴調(diào)用者這些方法的參數(shù)有什么要求. 但是這樣做有一個(gè)缺點(diǎn), 就是這樣不能使調(diào)用者必須遵守調(diào)用要求. CLR4.0提供的代碼契約機(jī)制可以保證調(diào)用者遵守這些調(diào)用規(guī)則, 編譯時(shí)有編譯器進(jìn)行檢查, 運(yùn)行時(shí)有CLR來檢查. 它類似于c++的斷言機(jī)制. 但比c++的更豐富.
所有的代碼契約都在 System.Diagnostics.Contracts.CodeContract靜態(tài)類中定義. 來看幾個(gè)常用的:
方法體剛進(jìn)入時(shí)用:
CodeContract.Requires(x>= 0);  明眼人一看就懂,  它受編譯開關(guān)的影響, 比如你可以只在調(diào)試模式下使用此代碼契約.
CodeContract.RequiresAlways(x>= 0); 基本和上面這個(gè)一樣, 唯一區(qū)別它不受編譯開關(guān)的影響,即不管是Debug還是Release模式都要包括這個(gè)代碼契約.
方法體退出時(shí)用(這些須寫在方法體的開始處):
// 方法體關(guān)閉時(shí)必須為真 must be true if method closes successfully  | 
對(duì)象不變量
對(duì)象不變量確保所有公共方法返回時(shí)某些條件必須滿足. 對(duì)象不變量定義在一個(gè)單獨(dú)的方法內(nèi), 此方法要有[ContractInvariantMethod]做標(biāo)注. 方法名無所謂, 但是方法必須返回void, 并且沒有參數(shù), 方法體內(nèi)可以有多個(gè)CodeContract.Invariant語句, 如:
[ContractInvariantMethod]   void ObjectInvariant() {  | 
【編輯推薦】















 
 
 






 
 
 
 