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