C# 代码契约确保不为循环验证
我刚刚开始玩弄.Net代码契约(在VS2010 Ultimate.NET4中),试图了解静态检查器可以证明什么和不能证明什么 我尝试以下示例:-C# 代码契约确保不为循环验证,c#,.net,code-contracts,C#,.net,Code Contracts,我刚刚开始玩弄.Net代码契约(在VS2010 Ultimate.NET4中),试图了解静态检查器可以证明什么和不能证明什么 我尝试以下示例:- public int Mult(int num1, int num2) { Contract.Requires(num2 >= 0); Contract.Ensures(Contract.Result<int>() == (num1 * num2)); int result =
public int Mult(int num1, int num2)
{
Contract.Requires(num2 >= 0);
Contract.Ensures(Contract.Result<int>() == (num1 * num2));
int result = 0;
for (int i = 0; i < num2; i++)
{
result = result + num1;
}
return result;
}
public int Mult(int num1,int num2)
{
合同要求(num2>=0);
Contract.survey(Contract.Result()==(num1*num2));
int结果=0;
对于(int i=0;i
一个简单的乘法函数的实现,通过重复加法
静态检查器无法验证是否满足后条件:-
CodeContracts: ensures unproven: Contract.Result<int>() == (num1 * num2)
CodeContracts:确保未经验证:Contract.Result()==(num1*num2)
我的函数实际上没有正确地计算产品。。或者静态检查器无法验证所需的数据还有其他原因吗?环路的存在是否会导致it困难
如果静态检查器在存在循环时很难验证东西,我可以想象一直有很多警告会让人非常恼火
我不喜欢用假设来告诉它我的想法,因为通常是我的无效假设首先导致了错误
那么,当静态检查器无法证明某些东西时,我们如何着手帮助它呢?
例如,我可以将该函数重写为递归函数—那么检查器是否能够更轻松地验证它?(函数式编程的拥护者可能会说,这就是它应该首先编写的方式——不改变状态等等!)。我还可以通过什么方式更改代码,使静态检查器更容易使用
谢谢!:) 静态检查器将永远无法证明这一点,但运行时检查器将证明这一点 静态检查器在编译时应用。为了能够证明你的能力,它必须能够全面分析你的算法和你在做什么。它没有那么强大
当然,运行时检查器将在每次函数退出时验证确保,并通过适当的单元测试,这将证明确保的有效性。静态检查器永远无法证明这一点,但运行时检查器将证明这一点 静态检查器在编译时应用。为了能够证明你的能力,它必须能够全面分析你的算法和你在做什么。它没有那么强大
运行时检查器当然会在每次函数退出时验证确保,并通过适当的单元测试,这将证明确保的有效性。这里有一些相关信息:@Jeffrey,碰巧我链接到了与您相同的博客帖子。有趣!:)这里有一些相关的信息:@Jeffrey,我碰巧链接到了和你一样的博客帖子。有趣!:)