提问人:user1935724 提问时间:5/8/2019 更新时间:5/15/2019 访问量:54
Contract.Requires() 和循环不变的问题
Issues with Contract.Requires() and loop invariant
问:
我正在遵循代码合约教程(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.
答:
0赞
Ɖiamond ǤeezeƦ
5/15/2019
#1
在回答第一个问题时,请从此处下载并运行代码协定.msi文件。.msi 文件包括静态检查器和二进制重写器(用于运行时检查),它通过注入协定来修改程序,使它们作为程序执行的一部分进行检查。如果没有重写器,合同将不会被检查。请注意,重写器仅适用于 Visual Studio 2013 和 2015。
在回答第二个问题时,你不能用来检查循环不变性。我建议在循环中使用。Contract.Invariant()
Contract.Assume()
评论