2010-10-12 85 views
9

代碼合同很好的工作,直到你必須添加一個bazillion Contract.Assume(...)來獲得框架代碼的結果。例如,MemoryStream.ToArray()永遠不會返回一個空數組,儘管我可以從Reflector中查看它,但它沒有記錄爲合同,所以我必須在任何地方都使用Assume如何爲現有框架(BCL)代碼指定代碼合同?

是否有一種神奇的方式來爲已經存在的函數創建契約庫?我猜測,一旦你獲得了幾十個最常用的框架功能,警告就會變得更加美味。

+2

今天,「從不返回空數組」*無論如何。關於合同的其中一件事是你不應該改變它。沒有這樣的合同*可能*表明它可能會改變。也許。 – 2010-10-12 20:17:27

+0

是一個公平點,但在代碼合同的情況下,我懷疑這是因爲合同團隊沒有時間在任何地方添加合同。請參閱http://social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/d8e2c2ad-de37-42ef-a854-02052d821975,其中一位團隊成員注意到「我們正在儘快填補空缺儘管我們可以,但它主要是由我們驅動的,或者你發現重要的差距在哪裏。理想情況下,我們會系統地通過圖書館並註釋它們,目前我們沒有人力。 – 2010-10-12 20:23:36

回答

1

我不認爲你可以直接。有幾件事要做:

要求合同添加在代碼合同論壇this thread

Code Contracts團隊現在提出的解決方法是製作一個靜態方法,該方法將假設您需要的所有合同。我覺得這個工作最好與擴展方法:

static class Contracted 
{ 
    byte[] ToArrayContracted(this MemoryStream s) 
    { 
     Contract.Requires(s != null); 
     Contract.Ensures(Contract.Result<byte[]>() != null); 

     var result = s.ToArray(); 
     Contract.Assume(result != null); 
     return result; 
    } 
} 

這樣一來,你用s.ToArrayContracted()代替s.ToArray(),一旦合同可用的類型,你可以搜索和替換ToArrayContractedToArray