C#代码契约:数组操作
本文关键字:数组 操作 契约 代码 | 更新日期: 2023-09-27 18:00:17
对于大学,我必须学习如何处理C#中的代码契约。
我想把它用于这个方法,它应该返回数组中最小的元素:
public int minarray(int[] minarray)
以下是我得到的,但我不知道这是否正确:
public int minarray(int[] minarray)
{
//Neither the array should be empty nor null
Contract.Requires(minarray != null && minarray.Length != 0);
//Save the result...
int result = Contract.Result<int>();
//...and check:
Contract.Ensures(Contract.ForAll(0, minarray.Length, i => minarray[i] >= result));
}
有人能告诉我这是对的吗?或者我只是写了一篇完全没有意义的文章吗?我会非常感激的。
除此之外,下一项任务是:
public int[] posnegarray(int[] posneg)
这应该会将方法中所有元素的符号(例如,从(1,-2,3)更改为(-1,2,-3)。
public int[] posnegarray(int[] posneg)
{
//Neither the array should be empty nor null
Contract.Requires(posneg != null && posneg.Length != 0);
//Save the result...
int resarray = Contract.Result<int[]>();
//...and check:
Contract.Ensures(Contract.ForAll(0, posneg.Length, i => posneg[i] == (-1) * resarray[i] ));
int[] returnarray = new int[posneg.Length];
for(int j = 0; j < posneg.Length; j++)
returnarray[j] = posneg[j] * (-1);
return returnarray;
}
这是正确的吗?
Contract.Result只能在Contract中使用。确保方法没有实际执行,但只表示结果。您使用它的方式将执行该方法,该方法将返回默认值(对于int,它将为0),然后在确保方法中使用该默认值,这可能不是您所期望的。您应该将Result方法放入这样的确保中:
Contract.Ensures(Contract.Result<int>() >= -1);