2010-05-06 71 views
9

我刚刚开始学习有关VS2010标准的代码合同库。有一件事我马上就想到了合约条款的真正含义。Contract.Exists如何增加价值?

例如,这两种说法如何不同?

Contract.Requires(!mycollection.Any(a => a.ID == newID)); 
Contract.Requires(!Contract.Exists(mycollection, a => a.ID == newID)); 

换句话说,是什么Contract.Exists做实际的目的,无论是对开发者使用我的功能,或用于静态代码分析系统?

+0

@Chris Pebble,可能重复讨论List.Exists与IEnumerable.Any之间的区别。这一个与Contract.Exists有关 - 这是一个不同的上下文。 – Elisha 2010-05-06 21:58:16

+0

好点。请原谅这个错误。 – 2010-05-06 22:07:50

回答

1

好的,我找到了答案。根据代码合同用户手册第2.7.2节:

“也可以使用扩展方法System.Linq.Enumerable.Any而不是Contract.Exists。”

所以它们是等价的。我将使用Any而不是Exists,所以它与我们的其他代码一致。

4

使用Contract.Exists的版本由于其声明性质而更受欢迎。另一个优点是框架知道这个合同,它有更好的机会在静态分析中“被捕获”。

+0

您能否详细说明“由于其声明性而偏好”的含义? 此外,静态分析实际上是否与代表一起工作?我认为你可以将任意代码放入该lambda的事实会使任何可能的静态分析无效。 – scobi 2010-05-07 16:16:32