우리 프로젝트에서는 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.Requires
는 Debug.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
)
로
(+1)이 응답에서 "코드 계약을 설치하지 않았습니다."는 BUILD 컴퓨터를 참조하고 있음에 유의하십시오. 물론 고객의 컴퓨터에 설치된 코드 계약은 필요하지 않습니다. 또한 일반적으로 "맞춤 매개 변수 유효성 검사"보다는 "표준 계약 필요"조립품 모드를 선택해야합니다 (불행히도 기본값으로 표시됨). –
@MatthewWatson 당신은 완전히 정확합니다. 그리고 그것에 대해 조금 더 명확하게 대답을 편집했습니다. – hvd