我有一个基本问题,可能很明显,但由于某种原因,我似乎无法成功安装和使用代码合同。
我已经从 MSDN 下载了该软件包,并按照在线文档进行了安装,但我仍然收到以下代码语句的 IDE 警告:
Contract.Requires(inputParameter != "");
IDE警告是:
“跳过方法调用。编译器不会生成方法调用,因为方法是有条件的,或者是没有实现的部分方法”
在启用代码合同的过程中我遗漏了什么?我正在使用 VS2010 Ultimate SP1
我有一个基本问题,可能很明显,但由于某种原因,我似乎无法成功安装和使用代码合同。
我已经从 MSDN 下载了该软件包,并按照在线文档进行了安装,但我仍然收到以下代码语句的 IDE 警告:
Contract.Requires(inputParameter != "");
IDE警告是:
“跳过方法调用。编译器不会生成方法调用,因为方法是有条件的,或者是没有实现的部分方法”
在启用代码合同的过程中我遗漏了什么?我正在使用 VS2010 Ultimate SP1
这很可能是由于项目设置中未配置代码合同。如果您转到您的项目属性,您应该会看到一个 Code Contracts 选项卡。在选项卡上,选择您正在构建的模式(Debug|Release|Both),然后通过选中相应的复选框来打开 Code Contracts 功能。
当代码合同未设置为Build
.
如果您没有看到 Code Contracts 选项卡,那么您可能需要在您的机器上安装 Code Contracts。通过从此处下载并安装安装程序来执行此操作。
条件编译都是由编译器预处理器定义驱动的。这与用于DEBUG
常量的方法相同,尽管 Visual Studio 将其定义隐藏在复选框后面。这是一种有效的方法,因为当没有定义这些符号时,根本不会调用这些方法;重要的是,传递的参数也不会被评估,因此您可以在代码合同中使用相对昂贵的检查,而不必担心这些检查会减慢发布构建。
微软对代码合同的介绍是这样说的:
合约类中的大部分方法都是有条件编译的;也就是说,仅当您使用#define 指令定义特殊符号 CONTRACTS_FULL 时,编译器才会发出对这些方法的调用。CONTRACTS_FULL 允许您在代码中编写合约而不使用#ifdef 指令;您可以生成不同的版本,有些有合同,有些没有。
虽然这谈到了#define
在代码中使用来打开代码契约:
#define CONTRACTS_FULL
正如@NirMH 在评论中所说,通常最好在项目的条件编译符号中定义它,这样您就可以将它用于某些构建,而将其用于其他构建。
请注意,这CONTRACTS_FULL
是您唯一的选择,尽管它显然被命名为允许将来进行更精细的控制。