我应该为任何方法结果执行Contract.Ensures吗?

4

假设我有这个:

[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Ensures(Contract.Result<TimeSpan>() == TimeSpan.FromSeconds(i));
    return TimeSpan.FromSeconds(i);
}

我是否需要以如此严格的方式确保合同的结果,还是这是不必要的?


在这种情况下呢?

[Pure]
public static T IfTrue<T>(this bool b, T value)
{
    Contract.Ensures(Contract.Result<T>().Equals(b ? value : default(T)));
    return b ? value : default(T);
}

我的问题是:

  1. 我是否正确地指出了这种精确的合同保障?
  2. 我是否有义务提供如此严格的合同保障,为什么?
  3. 如果我的合同保障在应用程序中重复(在许多情况下),return语句是否可以重复?

你想要实现什么目标? - gdoron
我正在学习 Code Contracts - AgentFire
这看起来像是一种好的做法被过度使用了。建议避免。 - Louis Kottmann
1
在这里,你正在测试C#中的return关键字是否实际起作用。说真的吗?你应该测试特定的值,即使在如此微不足道的方法中,这也是毫无意义的。 - Louis Kottmann
@Baboon,我实际上是在指向代码合同工具,这个方法将返回什么值,这样它就可以更好地形成内部变量,而不会抛出愚蠢的警告。我是不是正确? - AgentFire
1
看看Damien的回答,那些契约是有意义的。 - Louis Kottmann
2个回答

4

想一想“合约”这个词 - 在编写代码时,你希望向调用者保证什么(或对于Requires,你希望他们为你保证什么)。

对于像你展示的那些微不足道的例子,我想不出你想要包括的太多作为一个“合约”。也许对于第一个,我会选择:

[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Requires(i>0);
    Contract.Ensures(Contract.Result<TimeSpan>().TotalSeconds > 0.0);
    return TimeSpan.FromSeconds(i);
}

我向我的呼叫者保证我会产生积极的结果。显然,如果我在这个方法中包含更复杂的数学,我可以提供类似的合同。我将对范围进行保证,但我不会保证结果计算的确切方式(因为可能会发生变化)。


0

方法的纯洁性意味着,方法调用不会导致任何对对象状态可见的副作用。 就是这样。

当然,纯方法可以是公共的,并且可以定义自己的前置条件和后置条件。这取决于具体的方法使用情况。


这个问题更多关于Contract.Ensures的使用。您能否告诉我这个方法是否必须存在,为什么? - AgentFire
@AgentFire: 什么方法和哪里?如果你的意思是,在[Pure]方法中是否需要使用Contract.Ensures,那么答案是“不需要”。Contract.Ensures可以放在[Pure]方法中吗?可以。Contract.Ensures何时可以放置在[Pure]方法中?这取决于具体的方法目的。 - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接