2013-12-12 17 views
3

在我們的項目中,我們定義了兩個三種構建配置,Release,Debug和'Debug-plus-contracts'。這些被定義爲如下:合同會發生什麼?需要在沒有代碼合同的情況下安裝嗎?

<PropertyGroup Condition="'$(Configuration)' == 'Release'"> 
    <Optimize>true</Optimize> 
    <DebugType>pdbonly</DebugType> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)' == 'Debug'"> 
    <DefineConstants>TRACE;DEBUG</DefineConstants> 
    <DebugType>full</DebugType> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)' == 'Debug-plus-contracts'"> 
    <DefineConstants>TRACE;DEBUG;CONTRACTS_FULL</DefineConstants> 
    <CodeContractsEnableRuntimeChecking>True</CodeContractsEnableRuntimeChecking> 
    <CodeContractsRuntimeThrowOnFailure>False</CodeContractsRuntimeThrowOnFailure> 
    ... 

我們定義兩個調試配置,因爲「調試加合同」只有建立在安裝

Code Contracts for .NET

我的問題是,會發生什麼變化的線路,如Contract.Requires(source.Any())時它是在每個配置中編譯的?假設它在運行時被違反,哪些配置會發生什麼?


我問,因爲我聽說(的地方),在調試配置,Contract.Requires被編譯成Debug.Assert。但有證據表明這不是真的,我們有一些Contract.Requires在Debug-plus中失敗,但在Debug中失敗。

回答

4

Contract.Requires被聲明爲

[ConditionalAttribute("CONTRACTS_FULL")] 
public static void Requires(
    bool condition 
) 

[ConditionalAttribute("CONTRACTS_FULL")] 
public static void Requires(
    bool condition, 
    string userMessage 
) 

這意味着如果沒有定義CONTRACTS_FULL符號,以Requires任何呼叫將被由編譯器完全除去。檢查將不會執行。

如果你定義CONTRACTS_FULL符號,但你沒有在構建時安裝代碼契約或不使用它重寫,以Requires任何調用將拋出一個異常,無論檢查是否通過,告訴你,沒有代碼合同重寫器,它不會工作。請注意:這與Contract.Requires<TException>不同。後者不具有相同的ConditionalAttribute,所以在任何配置中都會失敗,除非使用代碼合約重寫器。

+0

(+1)請注意,此答案中的「您沒有安裝代碼合同」是指BUILD機器。您當然不需要在客戶機器上安裝代碼合同。另外請注意,通常您應該選擇「標準合同要求」的組裝模式,而不是「自定義參數驗證」(不幸的是,這似乎是默認設置)。 –

+0

@MthetheWWatson你完全正確,我已經編輯了我的答案,希望稍微清楚一點。 – hvd

相關問題