在我们的项目中,我们定义了两个三个构建配置,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 中没有。 最佳答案
Contract.Requires
声明为
这意味着如果没有定义 CONTRACTS_FULL
符号,任何对 Requires
的调用都将被编译器完全删除。根本不会执行检查。
如果您确实定义了 CONTRACTS_FULL
符号,但在构建时没有安装代码契约或不使用其重写器,则任何对 Requires
的调用都将抛出异常,无论检查是否通过,告诉您没有代码契约重写器,它不会工作。
注意:这与 Contract.Requires<TException>
不同。后者没有相同的 ConditionalAttribute
,因此除非使用代码契约重写器,否则在任何配置中都会失败。
关于c# - 在没有安装代码契约(Contract)的情况下构建时,Contract.Requires 会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20540721/