我试图实现方法的后置条件。我想保证它不会改变内部状态的某个特定部分(我修正了一个bug,因为它曾经这样做过,为了达到目的,我在代码中添加了后置条件)。我最好的尝试是如下:使用代码合同确保收集保持不变
Contract.Ensures(PropertyA.Collection.Count == Contract.OldValue(PropertyA.Collection).Count);
Contract.Ensures(Contract.ForAll(0, PropertyA.Collection.Count, index => this.PropertyA.Collection[index].Equals(Contract.OldValue(this.PropertyA.Collection)[index])));
这段代码的问题是,Contract.OldValue(PropertyA.Collection)
导致在第二行一个空引用异常。在第11.8节(http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf)中的代码合同手册中声明,这个特定的Contract.ForAll
应该与Contract.OldValue
一起使用,但另一个超载不适用。
是否有另一种方式,我可以执行检查PropertyA.Collection中的项目没有改变价值,也没有以某种方式重新排序?
我可能会写一个测试,而不是使用前置/后置条件来跟踪回归没有,好吧,再次倒退。这样你仍然会注意到,你不会每次都检查你的呼叫者。 – Joey
@Јοеу:我已经写了一个测试,所以它也覆盖了那里。来电者没有义务检查发布条件。被调用的方法保证PropertyA的Collection不受影响。 – Xilconic
我的意思是性能上的负担,而不是调用者每次都需要做点什么:-) – Joey