加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 代码合同:我们必须在委托方法中冗余地指定Contract.Requi

发布时间:2020-12-15 04:17:05 所属栏目:百科 来源:网络整理
导读:我打算使用新的.NET 4代码合同功能来进行开发.这让我想知道我们是否必须在一系列方法中冗余地指定等价的Contract.Requires(…)语句. 我认为代码示例值得一千字: public bool CrushGodzilla(string weapon,int velocity) { Contract.Requires(weapon != null
我打算使用新的.NET 4代码合同功能来进行开发.这让我想知道我们是否必须在一系列方法中冗余地指定等价的Contract.Requires(…)语句.

我认为代码示例值得一千字:

public bool CrushGodzilla(string weapon,int velocity)
    {
        Contract.Requires(weapon != null);

        // long code

        return false;
    }

    public bool CrushGodzilla(string weapon)
    {
        Contract.Requires(weapon != null);   // specify contract requirement here
                                             // as well???

        return this.CrushGodzilla(weapon,int.MaxValue);
    }

对于运行时检查,这并不重要,因为我们最终总是会遇到需求检查,如果失败,我们会收到错误.

但是,当我们再次在第二次重载中未指定合同要求时,是否认为是不良做法?

此外,还将编译时间检查功能,也可能设计代码合同的时间检查.它似乎尚未在Visual Studio 2010中使用C#,但我认为有一些语言,如Spec#已经做了.当我们编写代码来调用这样的方法时,这些引擎可能会给我们提示,我们的参数当前可以是或将为null.

所以我想知道这些引擎是否会始终分析一个调用堆栈,直到找到一个当前不满足的合同的方法?

此外,here I learned about the difference between Contract.Requires(...) and Contract.Assume(...).我想这个差异也是在这个问题的背景下考虑的呢?

解决方法

我认为最好的做法是规定每种公共方法的所有合同.合同不仅仅是“什么被检查” – 它的文档也是有效的.如果你调用一个方法,但是不知道应用什么契约,那么合同失败可能会降低一点:这表示你所调用的方法的错误,而不是你的方法.

请注意,如果您在整个项目中使用C#4,您可以考虑使用可选参数和命名参数来避免这么多重载.如果您需要从不支持这些语言的语言调用代码,那就没有用.

我强烈怀疑,如果您没有在“默认”超载中指定合同,则静态检查器(现在为available for all versions of VS2010)将抱怨合同可能会失败,并且还会建议在其中添加合同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读