15

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

我已经从 MSDN 下载了该软件包,并按照在线文档进行了安装,但我仍然收到以下代码语句的 IDE 警告:

Contract.Requires(inputParameter != "");

IDE警告是:

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

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

4

2 回答 2

12

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

当代码合同未设置为Build.

如果您没有看到 Code Contracts 选项卡,那么您可能需要在您的机器上安装 Code Contracts。通过从此处下载并安装安装程序来执行此操作。

于 2012-12-19T08:59:59.027 回答
5

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

微软对代码合同的介绍是这样说的:

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

虽然这谈到了#define在代码中使用来打开代码契约:

#define CONTRACTS_FULL

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

条件编译设置

请注意,这CONTRACTS_FULL是您唯一的选择,尽管它显然被命名为允许将来进行更精细的控制。

于 2016-01-30T09:22:52.347 回答