这是一个简单的图形操作方法,我用Code Contracts修饰。
确保索赔不会证明,但我不明白为什么!我相信它声称在调用Remove()之后,边缘不再位于边缘列表中,或者结果为false。如果结果为真,它没有声明图的状态。静态检查器不喜欢它,我没有让Pex告诉我怎么样(虽然我可能只是不知道如何使用它)。
对于这个例子,锁是无关紧要的,我相信,但我会留下它以防万一。此外,OnRemoveEdge的委托没有任何保证,但我现在隐含地假设它不能重新进入图形代码。此外,假设是在它之后。
public bool Remove(E edge)
{
Contract.Requires(edge != null);
Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());
lock (sync)
{
if (!OnBeforeRemoveEdge(edge)) return false;
if (!edges.Remove(edge)) return false;
}
OnRemoveEdge(edge);
Contract.Assume(!Contract.Exists(edges, e => e == edge));
return true;
}
更新:我更改了代码,将事件处理程序OnRemoveEdge()(但不是委托,OnBeforeRemoveEdge)移出锁定。但是,这对合同与线程相关的假设有何影响? Code Contracts是否采用单线程模型?嗯。
答案 0 :(得分:1)
来自Jack Leitch's answer to a similar question:
Code Contracts User Manual州,“静态合同检查员尚未处理量词人ForAll或Exists。”
真。真。