C# 在没有安装代码契约的情况下生成时,契约会发生什么情况?
在我们的项目中,我们定义了两个三个构建配置:发布、调试和“调试+契约”。这些定义如下:C# 在没有安装代码契约的情况下生成时,契约会发生什么情况?,c#,.net,code-contracts,C#,.net,Code Contracts,在我们的项目中,我们定义了两个三个构建配置:发布、调试和“调试+契约”。这些定义如下: <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <Optimize>true</Optimize> <DebugType>pdbonly</DebugType> </PropertyGroup> <PropertyGroup Condition="'$(
<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>
...
真的
pdbonly
痕迹;调试
满的
痕迹;调试;合同已满
真的
假的
...
我们定义了两种调试配置,因为“debug plus contracts”只构建在安装了
我的问题是,像Contract.Requires(source.Any())
这样的行在每个配置中编译时会发生什么?假设它在运行时被违反,在哪些配置中会发生任何事情
我这样问是因为我(在某处)听说在调试配置中,
Contract.Requires
被编译为Debug.Assert
。但有证据表明这不是真的,我们有一些契约。Requires
在Debug plus中失败,但在Debug中没有失败。契约。Requires
声明为
这意味着如果未定义CONTRACTS\u FULL
符号,编译器将完全删除对Requires
的任何调用。根本不会执行检查
如果您确实定义了CONTRACTS\u FULL
符号,但在构建时没有安装代码契约或没有使用其重写器,那么对Requires
的任何调用都将抛出异常,无论检查是否通过,都会告诉您,如果没有代码契约重写器,它将无法工作
注意:这与
合同不同。需要。后者没有相同的条件属性
,因此在任何配置中都会失败,除非使用代码契约重写器。(+1)请注意,此答案中的“您没有安装代码契约”指的是生成机器。当然,您不需要在客户的机器上安装代码契约。另外请注意,一般情况下,您应该选择汇编模式“标准合同要求”,而不是“自定义参数验证”(不幸的是,这似乎是默认设置)。@MatthewWatson您完全正确,我编辑了我的答案,希望能更清楚一点。
[ConditionalAttribute("CONTRACTS_FULL")]
public static void Requires(
bool condition
)
[ConditionalAttribute("CONTRACTS_FULL")]
public static void Requires(
bool condition,
string userMessage
)