Contract.Requires() 和循环不变的问题

Issues with Contract.Requires() and loop invariant

提问人:user1935724 提问时间:5/8/2019 更新时间:5/15/2019 访问量:54

问:

我正在遵循代码合约教程(https://learn.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts#usage-guidelines),但我似乎无法让最简单的东西正常工作。给定方法定义

public int Add(int x, int y)
{
   Contract.Requires(x > 0);
   Contract.Requires(y > 0);

   return x+y;
}

当我调用该方法时,该方法不会使前提条件检查失败。当我处于调试模式时,将跳过这些语句。我哪里做错了?o.Add(0,0)Contract.Requires()

第二个问题可以用来检查循环不变性吗?根据对象不变性的定义,这似乎与循环不变性略有不同,因为在每次循环迭代中,循环不变性可能不一定对客户端可见,因此它可能会违反属性但不会被检查。这种理解正确吗?Contract.Invariant()Object invariants are conditions that should be true for each instance of a class whenever that object is visible to a client.

C#-3.0 代码契约 验证形式 方法 循环不变

评论

0赞 Jeffrey L Whitledge 5/9/2019
你定义了#CONTRACTS_FULL吗?
0赞 Jeffrey L Whitledge 5/9/2019
是的,对象不变量不同于循环不变量。
0赞 user1935724 5/9/2019
@JeffreyLWhitledge那么如何检查循环不变性呢?我应该在循环的底部 Contract.Assert() 吗?
0赞 user1935724 5/9/2019
@JeffreyLWhitledge我到底该把#CONTRACTS_FULL放在哪里?
0赞 Ɖiamond ǤeezeƦ 5/15/2019
你使用的是哪个版本的 Visual Studio?

答:

0赞 Ɖiamond ǤeezeƦ 5/15/2019 #1

在回答第一个问题时,请从此处下载并运行代码协定.msi文件。.msi 文件包括静态检查器和二进制重写器(用于运行时检查),它通过注入协定来修改程序,使它们作为程序执行的一部分进行检查。如果没有重写器,合同将不会被检查。请注意,重写器仅适用于 Visual Studio 2013 和 2015。

在回答第二个问题时,你不能用来检查循环不变性。我建议在循环中使用。Contract.Invariant()Contract.Assume()