代码合同似乎不适用于VS2012

Mik*_*sen 20 .net c# code-contracts visual-studio-2012

我正在阅读代码契约,乍一看似乎是相当革命性的,但我似乎无法让它们发挥作用.我正在运行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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我希望编译失败,因为第一个参数Add是0,但程序成功并打印出5到控制台.

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

在此输入图像描述

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

更新:

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

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 ==========
Run Code Online (Sandbox Code Playgroud)

Mik*_*sen 13

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

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

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

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

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

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

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

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