2010-12-20 75 views

回答

2

假設使用代碼合同的代碼是通過二進制重寫器運行的,它會拋出您發佈的代碼等異常。重新編寫代碼並通過參數檢查來替換合同代碼等等。它有點像面向方面編程。在編譯完成後,它會注入代碼來處理您的情況。

如果他們不使用代碼合同,他們將不會得到執行靜態分析的好處,該分析旨在查看合同並警告他們可能會根據合同和代碼獲取錯誤。

Code Contracts

+0

有一點需要注意的是,靜態分析只有在使用高於Professional的Visual Studio 2010包時纔可用,這非常不幸。 :( – adamjford 2010-12-20 15:18:51

+0

是的,這是真的,這是令人傷心的。雖然親自,如果我必須支付它,它是值得的價格 – kemiller2002 2010-12-20 15:26:04

0

我一直使用代碼合同和臨時使用,他們解決了我2點的問題,沒有很好的解決方案,早期:檢查

  • 不變

    • 檢查返回值似乎是一個名字很差的組合參數檢查/入口點和返回值/退出點斷言。

    我可以爲返回值聲明一個臨時變量,並在返回它之前聲明一些東西,但這是額外的摩擦。

    檢查參數已經有一個解決方案:throw ArgumentException。

    代碼契約爲ArgumentException增加了一個小小的東西 - 它使你很早就檢查論據,在我看來這是一件好事。

    代碼合同還有很多事情要做,但我剛剛把我的腳趾頭放進去了,而且我沒有這個超級全面的靜態檢查版本。我打算更加全面地使用代碼契約,一旦我這樣做了 - 使用相同的框架檢查參數將更加優雅,而不是在Code Contracts和if/then/throw之間來回切換ArgumentException

  • +0

    只是一個關於不變量的更正;他們檢查退出任何公共方法,而不是每一行代碼。如果一個公共方法調用該類的任何其他方法,則不變檢查將被禁用,直到原始調用返回(如果方法調用另一個類的方法,而該方法又調用回原始類 - 則該情況也是這種情況在* original *方法返回時執行)。 – porges 2010-12-20 22:55:03

    +0

    @Porges然後我不明白他們做了什麼。我已經更新了我的答案。你的評論,我不明白 - 暗示我在不變式和返回值檢查之間沒有任何有趣的區別。 – MatthewMartin 2010-12-21 14:56:08

    +0

    它的設計使得不變量總是從其他類的角度來看。只要在將控件返回給調用者時它們爲true,類中的方法*可以臨時違反不變量。 – porges 2010-12-21 23:37:26

    1

    的一點是:這是可能的,如果你能在你的構建配置運行時檢查寫這樣

    Contract.Requires<ArgumentNullException>(argumentToCheck, "argumentToCheck"); 
    

    報表時,重寫將改寫這樣的先決條件,以一個普通ArgumentNullException。

    無論您是否安裝了代碼合同,代碼的調用者都將顯示爲ArgumentNullException或您提供的任何異常。

    相關問題