我正在阅读代码合同,乍一看似乎是相当革命性的,但我似乎无法让它们发挥作用。我正在运行Windows 8和Visual Studio 2012 Premium(两者的发行版本)。然后,我通过单击“下载代码合同”链接从here安装了代码合同。
然后我在一个全新的控制台应用程序中编写了以下代码:
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窗口的结果。看起来它正在做某事,但只是提出警告而不是错误。在我观看的视频中,这些内容被标记为编译错误,程序甚至无法运行。
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 ==========
答案 0 :(得分:13)
所以,问题似乎是几个限制和陷阱与代码合同的组合。希望这个答案能帮助像我这样的人刚开始。
首先,代码合同 支持Visual Studio 2012(Express以外的任何版本),因为版本1.4.50327.0,但如果您的版本低于1.4,则必须运行devenv.exe /setup
.50910.0。有关详细信息,请参阅Release Notes。
我遇到的第一个问题是在“代码合同”属性选项卡的“静态检查”部分中选中了“缓存结果”复选框。默认情况下,此选项处于启用状态,并且还要求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一样。
第二个问题是违反代码合同的行为被视为warnings, and not compile errors。即使您启用了“将警告视为错误”,您的程序也将继续编译并成功运行。如果您有一个较大的项目,您忽略了大量的警告,则可能很难注意到这些新的“代码合同”警告。在demo video I saw中,这些警告也反映在Visual Studio IDE中(调用代码有一个蓝色下划线),但我似乎没有在Visual Studio 2012中获得此行为。
这个设计决定让我感到不安。如果我在我的代码中定义一个契约,那么一个函数必须取一个大于0的整数,并且我公然传入一个0,这是一个错误。不是警告。我打破了那份简单而简单的合同。
总的来说,我认为Code Contracts非常强大,可能会改变我们测试软件的方式。 MS Research绝对做得很棒。但是,我认为它还没有为主流做好准备。它需要一些调整才能工作,它不能无缝集成到Visual Studio构建过程中,而且它也很慢。在较小的项目中,它按预期工作,但当我将其插入更大的项目时,分析所有代码花了十分钟。
答案 1 :(得分:2)
先生,您必须启用运行时检查。在您的窗口中,您发布为图像。
“完整”将表示将检查所有条件。 其余的都是自我解释的。