代码之家  ›  专栏  ›  技术社区  ›  Sebastian Good

如何为现有框架(BCL)代码指定代码契约?

  •  9
  • Sebastian Good  · 技术社区  · 14 年前

    代码契约工作得很好,直到你不得不添加无数个 Contract.Assume(...) 对于框架代码之外的结果。例如, MemoryStream.ToArray() 从不返回空数组,从Reflector中查看它可以看出,这是最好的,但它没有记录为契约,因此我必须 Assume 到处都是。

    有没有一种神奇的方法为已经存在的函数创建一个契约库?我猜,一旦您有几十个最常用的框架函数被外包出去,这些警告将变得更容易接受。

    1 回复  |  直到 14 年前
        1
  •  1
  •   porges    14 年前

    我觉得你不能直接说。有几件事要做:

    请求添加合同 this thread 在代码合同论坛上。

    代码契约团队目前建议的解决方法是创建一个静态方法,该方法假定您需要的所有契约。我发现这对扩展方法最有效:

    static class Contracted
    {
        byte[] ToArrayContracted(this MemoryStream s)
        {
            Contract.Requires(s != null);
            Contract.Ensures(Contract.Result<byte[]>() != null);
    
            var result = s.ToArray();
            Contract.Assume(result != null);
            return result;
        }
    }
    

    这边,你用 s.ToArrayContracted() 而不是 s.ToArray() 一旦合同 在类型上可用,您只需搜索和替换 ToArrayContracted ToArray .