代码合同很有效,直到你必须为框架代码中的结果添加一个巨大的Contract.Assume(...)
。例如,MemoryStream.ToArray()
永远不会返回一个空数组,就像我在Reflector中查看它一样,但它没有记录为契约,所以我必须Assume
无处不在。
是否有一种神奇的方法来为已经存在的功能创建合同库?我猜测,一旦你完成了几十个最常用的框架功能,这些警告就会变得更加可口。
答案 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
。