在我们的项目中,我们定义了两个三个构建配置,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>
...
我们定义了两个调试配置,因为'Debug-plus-contracts'仅在安装了Code Contracts for .NET的机器上构建
我的问题是,在每个配置中编译时,Contract.Requires(source.Any())
等行会发生什么?假设它在运行时被违反,配置会发生什么?
我问,因为我听说(在某处),在Debug配置中,Contract.Requires
被编译为Debug.Assert
。但有证据表明这不是真的,我们有一些Contract.Requires
在Debug-plus中失败但在Debug中没有。
答案 0 :(得分: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
,因此除非使用Code Contracts重写器,否则在任何配置中都会失败。