2011-07-14 39 views

回答

31

user manual對此進行了相當詳細的解釋 - 您可以選擇各種選項。每個構建配置可以有不同的設置,在執行時檢查契約,並且它不是「全部或全部」選擇​​ - 您可以根據可在Visual Studio中調整的設置來強制執行全部,部分或全部合同。

3

在您的項目屬性中,轉到代碼合同,選擇「發佈」配置並取消選中運行時檢查。

12

我有我最喜歡的選項描述on my blog

總結:

  • 在發佈模式,我建議取消選中執行運行時檢查合同,但選擇建設合同參考大會。這將把先決條件放置在一個單獨的dll中,客戶可以選擇使用它(如果它們檢查呼叫站點需求檢查),但是如果它們沒有檢查該選項,則刪除所有的開銷。
  • 在調試模式下,將執行運行時合同檢查設置爲完整。

有些人更喜歡先決條件包含在他們的發佈版本。如果通過NuGet分發,這是特別有用的,因爲they don't support Code Contract dlls。對於我的NuGet軟件包,我正在向Release版本中添加Preconditions,但也有單獨下載「Release without Preconditions」的版本。

6

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

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

@svanryckeghem和@Stephen克利: 如果您正在使用或計劃使用Contract.Requires<TException>並沒有啓用「運行時檢查合同」,你會得到關於IL重寫運行時發生故障(ccrewrite.exe)需要以必須遵守代碼合同的使用。然後您將被要求啓用運行時合同檢查以使其發揮作用。

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

+0

'Contract.Requires ()',我不同意這樣做更有用,我認爲它更像是遺留問題 - 我根本不使用它。合同要求幾乎所有的參數例外,布爾條件是足夠的信息;如果你設計的東西適當。 'Contracts'不僅是執行'Exception'的另一種方式,它們需要不同的方法。 – nicodemus13

+4

您評論中的操作短語是「...幾乎所有參數例外......」。我不想根據「差不多」來建立合同。如果我可以保證他們都是同一類型的例外,那麼是使用合同。需要()是多餘的。然而,這並不能保證,我寧願涵蓋所有的情況 - 特別是邊緣情況 - 否則你的合約變得無非是猜測。 –