2010-05-06 73 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