在我们的项目中,我们定义了两个三个构建配置,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/

10-13 06:22