我能開始使用的,而不是CodeContracts:應該CodeContracts替換常規的ArgumentExceptions嗎?
if (XXX == Y)
throw new ArgumentException("bla bla");
它是如何工作的,如果我開發一個圖書館和我的圖書館用戶不使用CodeContracts?
我能開始使用的,而不是CodeContracts:應該CodeContracts替換常規的ArgumentExceptions嗎?
if (XXX == Y)
throw new ArgumentException("bla bla");
它是如何工作的,如果我開發一個圖書館和我的圖書館用戶不使用CodeContracts?
假設使用代碼合同的代碼是通過二進制重寫器運行的,它會拋出您發佈的代碼等異常。重新編寫代碼並通過參數檢查來替換合同代碼等等。它有點像面向方面編程。在編譯完成後,它會注入代碼來處理您的情況。
如果他們不使用代碼合同,他們將不會得到執行靜態分析的好處,該分析旨在查看合同並警告他們可能會根據合同和代碼獲取錯誤。
我一直使用代碼合同和臨時使用,他們解決了我2點的問題,沒有很好的解決方案,早期:檢查
我可以爲返回值聲明一個臨時變量,並在返回它之前聲明一些東西,但這是額外的摩擦。
檢查參數已經有一個解決方案:throw ArgumentException。
代碼契約爲ArgumentException增加了一個小小的東西 - 它使你很早就檢查論據,在我看來這是一件好事。
代碼合同還有很多事情要做,但我剛剛把我的腳趾頭放進去了,而且我沒有這個超級全面的靜態檢查版本。我打算更加全面地使用代碼契約,一旦我這樣做了 - 使用相同的框架檢查參數將更加優雅,而不是在Code Contracts和if/then/throw之間來回切換ArgumentException
只是一個關於不變量的更正;他們檢查退出任何公共方法,而不是每一行代碼。如果一個公共方法調用該類的任何其他方法,則不變檢查將被禁用,直到原始調用返回(如果方法調用另一個類的方法,而該方法又調用回原始類 - 則該情況也是這種情況在* original *方法返回時執行)。 – porges 2010-12-20 22:55:03
@Porges然後我不明白他們做了什麼。我已經更新了我的答案。你的評論,我不明白 - 暗示我在不變式和返回值檢查之間沒有任何有趣的區別。 – MatthewMartin 2010-12-21 14:56:08
它的設計使得不變量總是從其他類的角度來看。只要在將控件返回給調用者時它們爲true,類中的方法*可以臨時違反不變量。 – porges 2010-12-21 23:37:26
的一點是:這是可能的,如果你能在你的構建配置運行時檢查寫這樣
Contract.Requires<ArgumentNullException>(argumentToCheck, "argumentToCheck");
報表時,重寫將改寫這樣的先決條件,以一個普通ArgumentNullException。
無論您是否安裝了代碼合同,代碼的調用者都將顯示爲ArgumentNullException或您提供的任何異常。
有一點需要注意的是,靜態分析只有在使用高於Professional的Visual Studio 2010包時纔可用,這非常不幸。 :( – adamjford 2010-12-20 15:18:51
是的,這是真的,這是令人傷心的。雖然親自,如果我必須支付它,它是值得的價格 – kemiller2002 2010-12-20 15:26:04