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;
}

这是正确的吗?

C#代码契约:数组操作

Contract.Result只能在Contract中使用。确保方法没有实际执行,但只表示结果。您使用它的方式将执行该方法,该方法将返回默认值(对于int,它将为0),然后在确保方法中使用该默认值,这可能不是您所期望的。您应该将Result方法放入这样的确保中:

Contract.Ensures(Contract.Result<int>() >= -1);