C# 合同如何增加价值?

C# 合同如何增加价值?,c#,code-contracts,C#,Code Contracts,我刚刚开始了解VS2010标准附带的代码契约库。我马上遇到的一件事是合同条款的真正含义 例如,这两种说法有何不同 Contract.Requires(!mycollection.Any(a => a.ID == newID)); Contract.Requires(!Contract.Exists(mycollection, a => a.ID == newID)); 换句话说,Contract.Exists在实际应用中做了什么,无论是对于使用my函数的开发人员,还是对于静态代码分

我刚刚开始了解VS2010标准附带的代码契约库。我马上遇到的一件事是合同条款的真正含义

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

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

换句话说,Contract.Exists在实际应用中做了什么,无论是对于使用my函数的开发人员,还是对于静态代码分析系统?

由于其声明性,使用
Contract.Exists的版本是首选的。另一个优点是,框架知道这个契约,它更有可能在静态分析中被“捕获”。

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

“也可以使用扩展方法System.Linq.Enumerable.Any代替Contract.Exists。”


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

@Chris Pebble,可能的副本谈到List.Exists与IEnumerable.Any之间的区别。这一个与合同有关。存在-这是一个不同的上下文。好的观点。请原谅我的错误。你能详细解释一下你所说的“由于其声明性质而优先”是什么意思吗?此外,静态分析是否确实适用于代理?我认为,事实上,您可以将任意代码放入lambda中,这将使任何可能的静态分析无效。