2011-11-28 78 views
33

這是我的問題。我是合約設計的忠實粉絲,我正在使用這個概念,特別是在開發可供其他開發人員使用的庫時。我只是發現了這樣的一種新的方式是:Contract.Requires,而不是Exception: 因此,而不是具有:Contract.Requires usage

public void SomeMethod(string name){ 
    if(name==null) throw new NullArgumentException("Null values not supported"); 
} 

我現在有:

public void SomeMethod(string name){ 
    Contract.Requires(name != null); 
} 

編輯:我下工作VS2010在調試模式下。

問題:Contract.Requires什麼都不做,即使namenull

MSDN文件說:

指定外層方法或 財產的前提條件的合同。

但沒有指定條件不滿足的情況!

我也注意到有otherContract.Requires重載,拋出異常,顯示消息...但那麼什麼是Contract.Requires(Boolean)?下面

編輯解答強調,插件必須安裝有Contract API的全功率但後來怎麼樣誰希望自己的代碼有同樣的表現在不同平臺上的用戶單?

+0

您可能會覺得這很有用:http://stackoverflow.com/questions/6483055/code-contracts-for-mono –

+1

感謝您的提示。有了這一切麻煩,我認爲我最好不得不堅持舊的方式拋出異常 – GETah

回答

23

你應該請執行以下操作:

  1. 安裝代碼契約插件作爲nfechner指出
  2. 轉到項目屬性,「代碼契約」的文件夾
  3. 檢查「執行運行時檢查合同」
  4. 開關「大會模式」向「標準合同要求」
  5. 用您的Contract.RequiresContract.Requires<SomeException>(第一個拋出System.Diagnostics.ContractException而第二個罰球您指定的例外,這是重要的公共方法)這是

基本設置。爲了更準確的配置,refer to the manual

如果您使用單聲道,可能合同類是空的。我沒有這樣做,但合同手冊第七章似乎解釋瞭如何提供自己的實現。

+1

+1上的更新。我寧願在這種情況下堅持例外。 MONO有沒有類似的工具? – GETah

+1

我已更新帖子。希望能幫助到你。 –

+0

我不僅對在MONO中使用這個感興趣,而且希望從Windows到Linux的可移植性,反之亦然 – GETah

11

Contract class docs

重要

您必須安裝Visual Studio插件,以執行合同。 Code Contracts Premium Edition加載項允許您在項目屬性頁面上指定代碼合同的靜態和運行時間 檢查。如果 未啓用運行時檢查,則合同(例如Contract.Ensures 方法)不會在運行時拋出異常,如果合同違反了 。 Visual Studio加載項不附帶Visual Studio 2010或Windows SDK。

+0

+ 1的提示​​,但這隻能解決問題的一端。有關這些提示,請參閱我在 – GETah

2

有了這樣的消息,通常可以指定您所做的事情。

例如,你沒有原來的郵件中提到,如果你已經安裝了VS插件,也不是說你已經在你的項目屬性啓用它,或者你實際上是在調試VS釋放模式運行等

Re Contract.Requires vs Contract.Requires<Exception>

Contract.Requires被推薦。 根據手冊

如果你的代碼必須拋出一個 特定的前提條件的失敗特定的異常,可以用下面的通用重載形式 。 (請在您的 代碼提交到本表格前,請先閱讀第5.1,但不運行合同工具 上的所有版本,則不能使用Requires < Exn <Exn>>。如果你這樣做,你會得到一個運行故障每次。)