我有一个基本的问题,可能是这么明显,但由于某种原因,我似乎无法成功安装和使用代码合同。
我从MSDN下载了软件包,按照在线文档安装了它,但我仍然收到以下代码声明的IDE警告:
Contract.Requires(inputParameter != "");
IDE警告是:
“跳过方法调用。编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法”
在启用代码合同的过程中我遗漏了什么?我正在使用VS2010 Ultimate SP1
答案 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在评论中所说的那样,通常最好在项目的条件编译符号中定义它,这样你就可以将它用于某些版本而不用于其他版本。
请注意,CONTRACTS_FULL
是您唯一的选择,虽然它的名称已经明确,以便将来可以进行更精细的控制。