首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于任何方法的结果,我应该做Contract.Ensures吗?

对于任何方法的结果,我应该做Contract.Ensures吗?
EN

Stack Overflow用户
提问于 2012-11-16 10:48:39
回答 2查看 1.1K关注 0票数 4

假设我有这个:

代码语言:javascript
复制
[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Ensures(Contract.Result<TimeSpan>() == TimeSpan.FromSeconds(i));
    return TimeSpan.FromSeconds(i);
}

我确保合同结果如此严格是对的,还是没有必要?

在这种情况下呢?

代码语言:javascript
复制
[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语句吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-16 13:25:01

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

对于您所展示的那些琐碎的例子,我想不出有多少您想要作为合同包含的内容。也许对于第一个,我会去:

代码语言:javascript
复制
[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Requires(i>0);
    Contract.Ensures(Contract.Result<TimeSpan>().TotalSeconds > 0.0);
    return TimeSpan.FromSeconds(i);
}

我会向我的来电者保证我会产生积极的结果。显然,如果我在这个方法中包含了更复杂的数学,这个类似的合同就可以给出。我将保证范围,但我不会保证结果是如何计算的(因为这可能会发生变化)。

票数 4
EN

Stack Overflow用户

发布于 2012-11-16 11:24:02

方法的纯度意味着,该方法调用不会导致任何调用者可见的副作用到对象状态.就这样。

当然,纯方法可以是公开的,并且可以定义自己的前后条件。这取决于具体的方法用例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13415055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档