去年我們已經開始在討論Spec#這是一個基於C#的支持通過契約來進行設計的語言以契約來設計是構建於諸如靜態類型化這樣的概念之上的特定的動作只有在編譯時被驗證之後才能執行契約通常使用前置和後置條件的形式來表示比如一個參數或返回值永遠不能為空或者只能包含某個特定范圍的值
為了不讓開發人員學習整個諸如Spec#這樣的新語言微軟正在構建一個獨立於語言的函數庫可以被任何NET語言所利用在某些方面契約 看上去類似斷言不過它們本質上存在非常大的區別契約通過靜態代碼分析的組合來實現它能被用於編譯器內部和外部以及測試框架之中它們也能被執行 這意味著它們在運行調試版本的時候和斷言很類似讓我們來看第一個例子
string GetDescription(int x){
Contract
Requires(x>
);
Contract
Ensures(Contract
Result() != null);
如果只看簽名開發人員只能獲得靜態類型的信息GetDescription要求輸入一個整數並返回一個字符串而通過附加契約開發人員和工具都可以知道GetDescription要求輸入一個正整數並返回一個不能為空的字符串
除了顯式的契約之外契約檢查器也支持隱式的契約一個例子就是被零除這樣的情況如果一個類包含一個整數除法其中的除數是一個變量那麼所 有的代碼路徑都必須保證這個變量不會為零或者會引發一個警告如果在這種情況中的變量是一個開放類的屬性那麼它也會要求檢查每個子類對於非關聯化空值 和數組索引也存在一些隱式契約
為了讓契約設計更容易還存在一個ObjectInvariant方法的概念這個特別的方法只包含契約可以被注入到每個方法調用的末尾以保證對象的狀態保持一致要著重注意的是這個東西要應用到所有方法之中包括那些來自於其他程序集的子類
From:http://tw.wingwit.com/Article/program/net/201311/15147.html