2011-05-27 99 views
2

代碼合約使用太多會減慢編譯過程。 其次代碼合同是調試模式的一部分,只有當我設置代碼合同並始終在發佈模式下編譯代碼時,代碼合同纔會工作?我想它不會這意味着開發人員將被迫在調試模式下工作,並且當您創建設置時,將其設置爲釋放模式。我對嗎?從MS Devlab代碼合同和編譯

+0

微軟的.Net代碼合同? – 2011-05-27 18:32:43

+0

是的,請標記語言和/或平臺。 – 2011-05-28 20:24:34

+0

@ Ken,Henk:[code-contracts]標籤專門用於微軟的Code Contracts項目。 – porges 2011-05-30 07:11:48

回答

0

假設代碼契約,

  1. 編譯:本合同工具激活你的編譯。有一個用於運行時檢查的重寫器,並且需要(少許)時間作爲構建的一部分。
    之後運行靜態驗證程序,但在後臺運行。您不必等待它,除非您想立即看到消息。

  2. 運行時行爲。這可以從完全關閉(基準),僅需要/需要+確保(釋放)到完全(分析/調試)這幾個步驟進行配置。

+1

還值得注意的是,靜態驗證器現在緩存條目,以便只重新評估自上一次構建以來發生更改的功能。 – porges 2011-05-30 03:03:18

+0

感謝@Henk和@Porges – Deepesh 2011-05-30 05:15:43

4

由於CodeContracts的工作方式,編譯速度有所減慢。有一個IL重寫器,它根據您指定的合約將代碼注入您的方法。這發生在C#編譯器出現併爲您的程序集生成IL之後。

運行時性能差異非常小,不會以明顯的方式影響您的代碼。除非你正在開發一些實時股票交易系統,否則我真的不會擔心它。

就禁用生產中的代碼合同而言,我寧願有代碼合同的附加保護,以避免錯誤。代碼合同中的一個錯誤會告訴你究竟違反合同的地點和原因,而不是因爲某些不良數據在調用堆棧樹上傳入5個級別而不得不深入一些深層調用堆棧。

如果您正在使用或正在計劃使用Contract.Requires<TException>並且未啓用'運行時合同檢查',那麼IL重寫程序需要綁定到代碼合同的使用時會出現運行時失敗。然後您將被要求啓用運行時合同檢查以使其發揮作用。

恕我直言,使用Contract.Requires<TException>()Contract.Requires()更有用,因爲您可以控制拋出的異常類型。

編輯:我忘了添加的一件事是IL重寫器完全獨立於C#編譯器,並且兩者之間沒有依賴關係。