2010-10-12 47 views
9

代码合同很好的工作,直到你必须添加一个bazillion Contract.Assume(...)来获得框架代码的结果。例如,MemoryStream.ToArray()永远不会返回一个空数组,尽管我可以从Reflector中查看它,但它没有记录为合同,所以我必须在任何地方都使用Assume如何为现有框架(BCL)代码指定代码合同?

是否有一种神奇的方式来为已经存在的函数创建契约库?我猜测,一旦你获得了几十个最常用的框架功能,警告就会变得更加美味。

+2

今天,“从不返回空数组”*无论如何。关于合同的其中一件事是你不应该改变它。没有这样的合同*可能*表明它可能会改变。也许。 – 2010-10-12 20:17:27

+0

是一个公平点,但在代码合同的情况下,我怀疑这是因为合同团队没有时间在任何地方添加合同。请参阅http://social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/d8e2c2ad-de37-42ef-a854-02052d821975,其中一位团队成员注意到“我们正在尽快填补空缺尽管我们可以,但它主要是由我们驱动的,或者你发现重要的差距在哪里。理想情况下,我们会系统地通过图书馆并注释它们,目前我们没有人力。 – 2010-10-12 20:23:36

回答

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(),一旦合同可用的类型,你可以搜索和替换ToArrayContractedToArray