如何安装和使用代码合同?

时间:2012-12-19 08:51:33

标签: c# visual-studio-2010 code-contracts

我有一个基本的问题,可能是这么明显,但由于某种原因,我似乎无法成功安装和使用代码合同。

我从MSDN下载了软件包,按照在线文档安装了它,但我仍然收到以下代码声明的IDE警告:

Contract.Requires(inputParameter != "");

IDE警告是:

“跳过方法调用。编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法”

在启用代码合同的过程中我遗漏了什么?我正在使用VS2010 Ultimate SP1

2 个答案:

答案 0 :(得分:12)

这很可能是因为未在项目设置中配置代码合同。如果转到项目属性,则应看到“代码约定”选项卡。在选项卡上,选择您正在构建的模式(Debug | Release | Both),然后通过选中相应的复选框打开Code Contracts功能。

当代码合同未设置为Build时,我看到了您详细说明的警告。

如果您没有看到“代码约定”选项卡,则可能需要在计算机上安装“代码约定”。通过从here下载并安装安装程序来执行此操作。

答案 1 :(得分:5)

条件编译全部来自编译器预处理器定义。这与用于DEBUG常量的方法相同,尽管Visual Studio隐藏了复选框后面的定义。这是一种有效的方法,因为当这些符号没有被定义时,那些方法根本就没有被调用;重要的是,传递的参数也不会被评估,因此您可以在代码合同中使用相对昂贵的检查,而不必担心这些检查会减慢发布版本。

Microsoft's introduction to Code Contracts说:

  

合同类中的大多数方法都是有条件编译的;也就是说,只有在使用#define指令定义特殊符号CONTRACTS_FULL时,编译器才会发出对这些方法的调用。 CONTRACTS_FULL允许您在代码中编写合同而无需使用#ifdef指令;你可以制作不同的版本,有些是契约,有些是没有。

虽然这涉及在代码中使用#define来打开代码合同:

#define CONTRACTS_FULL

正如@NirMH在评论中所说的那样,通常最好在项目的条件编译符号中定义它,这样你就可以将它用于某些版本而不用于其他版本。

Conditional compilation settings

请注意,CONTRACTS_FULL是您唯一的选择,虽然它的名称已经明确,以便将来可以进行更精细的控制。