代码合同似乎不适用于VS2012

我正在阅读代码契约,乍一看似乎是相当革命性的,但我似乎无法让它们发挥作用。 我正在运行Windows 8和Visual Studio 2012 Premium(两者的发行版本)。 然后,我通过单击“下载代码合同”链接从此处安装了代码合同。

然后我在一个全新的控制台应用程序中编写了以下代码:

class Program { static void Main(string[] args) { var answer = Add(0, 5); Console.Write(answer); Console.ReadLine(); } static int Add(int x, int y) { Contract.Requires(x > 0 && y > 0); return x + y; } } 

我希望编译失败,因为Add的第一个参数是0,但是程序成功并向控制台输出5。

我已尝试使用默认的代码合约设置,并且还使用了一些东西而无济于事。 我当前的设置如下所示:

在此处输入图像描述

我有什么想法我做错了吗?

更新:

这是Build窗口的结果。 看起来它正在做某事,但只是提出警告而不是错误。 在我观看的video中,这些内容被标记为编译错误,程序甚至无法运行。

 1>------ Build started: Project: DeleteMe, Configuration: Debug Any CPU ------ 1> DeleteMe -> c:\users\mike\documents\visual studio 2012\Projects\DeleteMe\DeleteMe\bin\Debug\DeleteMe.exe 1> CodeContracts: Task manager is unavailable. 1> CodeContracts: DeleteMe: Run static contract analysis. 1> CodeContracts: Suggested requires: Contract.Requires(false); 1> CodeContracts: DeleteMe: Validated: 0.0 % 1> CodeContracts: DeleteMe: Contract density: 0.87 1> CodeContracts: DeleteMe: Total methods analyzed 4 1> CodeContracts: DeleteMe: Methods with 0 warnings 3 1> CodeContracts: DeleteMe: Total time 4.974sec. 1243ms/method 1> CodeContracts: DeleteMe: Methods with necessary preconditions: 1 1> CodeContracts: DeleteMe: Discovered 1 new candidate preconditions in 00:00:00.1718843 1> CodeContracts: DeleteMe: Retained 1 preconditions after filtering 1> CodeContracts: DeleteMe: Inferred 0 object invariants 1> CodeContracts: DeleteMe: Retained 0 object invariants after filtering 1> CodeContracts: DeleteMe: Detected 0 code fixes 1> CodeContracts: DeleteMe: Proof obligations with a code fix: 0 1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(14,10,14,33): warning : CodeContracts: requires is false: x > 0 && y > 0 1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(22,10,22,44): warning : CodeContracts: location related to previous warning 1> CodeContracts: Checked 1 assertion: 1 false 1> CodeContracts: DeleteMe: 1> CodeContracts: DeleteMe: Static contract analysis done. ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

因此,这个问题似乎是代码合同的几个限制和陷阱的组合。 希望这个答案能帮助像我这样的人刚开始。

首先,代码合同确实支持Visual Studio 2012(除了Express之外的任何版本),因为如果你的版本早于1.4.50910.0,你必须运行devenv.exe /setup 。 有关更多信息,请参阅发行说明 。

我遇到的第一个问题是在“代码约定”属性选项卡的“静态检查”部分中选中了“缓存结果”复选框。 默认情况下,此选项处于启用状态,并且还要求SQL Server CE存储其缓存数据,这些数据未由Windows 8,VS2012或Code Contracts安装。 不幸的是,你的程序将继续编译得很好,你必须手动浏览Build输出才能看到错误:

CodeContracts:xxx:未处理的exception:System.IO.FileNotFoundException:无法加载文件或程序集’System.Data.SqlServerCe,Version = 3.5.1.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91’或其依赖项之一。 该系统找不到指定的文件。

取消选中“缓存结果”复选框将解决此问题,就像安装SQL Server CE一样。

第二个问题是Code Contract违规被视为警告,而不是编译错误 。 即使您启用了“将警告视为错误”,您的程序也将继续编译并成功运行。 如果您有一个较大的项目,您忽略了大量的警告,则可能很难注意到这些新的“代码合同”警告。 在我看到的演示video中 ,这些警告也反映在Visual Studio IDE中(调用代码有一个蓝色下划线),但我似乎没有在Visual Studio 2012中获得此行为。

这个设计决定让我感到不安。 如果我在我的代码中定义一个契约,那么一个函数必须取一个大于0的整数,并且我公然传入一个0,这是一个错误。 不是警告。 我违反了合同,简单明了。

总的来说,我认为Code Contracts非常强大,可能会改变我们测试软件的方式。 MS Research绝对做得很棒。 但是,我认为它还没有为主流做好准备。 它需要一些调整才能工作,它不能无缝集成到Visual Studio构建过程中,而且速度也很慢。 在较小的项目上,它按预期工作,但当我将其插入更大的项目时,花了十分钟时间来分析所有代码。

先生,您必须启用运行时检查。 在您在窗口中,您发布为图像。

“完整”意味着将检查所有条件。 其余的都是自我解释的。

  • 静态检查仅在后台运行,并检查代码中可以改进的任何内容。 注意 – 它会使您的构建速度有所降低。