2013-12-12 3 views
3

우리 프로젝트에서는 Release, Debug 및 'Debug-plus-contracts'의 세 가지 빌드 구성을 정의합니다. 이들은 다음과 같이 정의되어 있습니다 만계약에 어떤 영향이 있습니까? 코드 계약을 설치하지 않은 경우 빌드가 필요합니까?

를 설치 Code Contracts for .NET와 시스템을 기반으로 '디버그 - 플러스 - 계약'때문에

<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> 
    ... 

우리는 두 개의 디버그 구성을 정의

내 질문은 라인에 무슨 일이 등 Contract.Requires(source.Any()) 때 각 구성에서 컴파일 되었습니까? 런타임에 구성이 위반되는 상황이 발생한다고 가정합니다.


나는 (곳) 들어 있기 때문에 물어 디버그 구성 즉, Contract.RequiresDebug.Assert로 컴파일됩니다. 그러나 증거는 이것이 사실이 아니라고 제안합니다. 디버그가 아닌 디버그에서는 실패한 Contract.Requires이 있습니다. CONTRACTS_FULL 기호가 정의되지 않은 경우, 어떤 호출 Requires 완전히 컴파일러에 의해 제거된다는 것을 의미한다

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

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

답변

4

Contract.Requires 선언된다. 수표는 전혀 수행되지 않습니다.

CONTRACTS_FULL 기호를 정의했지만 빌드시 코드 계약이 설치되지 않았거나 다시 작성자를 사용하지 않는 경우 Requires에 대한 호출은 수표의 통과 여부와 상관없이 예외를 throw합니다. 코드 계약서 작성자는 작동하지 않습니다.

참고 : 이것은 Contract.Requires<TException>과 다릅니다. 후자에는 동일한 ConditionalAttribute이 없으므로 코드 계약 재 작성 프로그램을 사용하지 않는 한 모든 구성에서 실패합니다.

+0

(+1)이 응답에서 "코드 계약을 설치하지 않았습니다."는 BUILD 컴퓨터를 참조하고 있음에 유의하십시오. 물론 고객의 컴퓨터에 설치된 코드 계약은 필요하지 않습니다. 또한 일반적으로 "맞춤 매개 변수 유효성 검사"보다는 "표준 계약 필요"조립품 모드를 선택해야합니다 (불행히도 기본값으로 표시됨). –

+0

@MatthewWatson 당신은 완전히 정확합니다. 그리고 그것에 대해 조금 더 명확하게 대답을 편집했습니다. – hvd