在没有安装代码合同的情况下构建时,Contract.Requires会发生什么?

时间:2013-12-12 10:19:30

标签: c# .net code-contracts

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

1 个答案:

答案 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重写器,否则在任何配置中都会失败。