如何为现有框架(BCL)代码指定代码合同?

时间:2010-10-12 19:55:26

标签: c# code-contracts

代码合同很有效,直到你必须为框架代码中的结果添加一个巨大的Contract.Assume(...)。例如,MemoryStream.ToArray()永远不会返回一个空数组,就像我在Reflector中查看它一样,但它没有记录为契约,所以我必须Assume无处不在。

是否有一种神奇的方法来为已经存在的功能创建合同库?我猜测,一旦你完成了几十个最常用的框架功能,这些警告就会变得更加可口。

1 个答案:

答案 0 :(得分:1)

我认为你不能直接。有几件事要做:

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

Code Contracts团队现在建议的解决方法是制作一个静态方法,承担您需要的所有合同。我发现这最适合使用扩展方法:

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(),一旦合同 可用,您就可以搜索并替换{{1} } ToArrayContracted