2010-05-06 8 views
9

Estoy empezando a aprender sobre la biblioteca de contratos de código que viene de serie con VS2010. Una cosa con la que me estoy metiendo de inmediato es lo que realmente significan algunas cláusulas del contrato.¿Cómo Contract.Exists agrega valor?

Por ejemplo, ¿cómo son estas dos declaraciones diferentes?

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

En otras palabras, ¿qué pueden hacer en Contract.Exists efectos prácticos, ya sea para un desarrollador usando mi función, o para el sistema de análisis de código estático?

+0

@Chris Pebble, el posible duplicado habla sobre la diferencia entre List.Exists a IEnumerable.Any. Este está relacionado con Contract. Exists - es un contexto diferente. – Elisha

+0

Buen punto. Perdonen el error. –

Respuesta

1

Ok, encontré la respuesta. Según el Manual de usuario de contratos de código, sección 2.7.2:

"También es posible utilizar el método de extensión System.Linq.Enumerable.Any en lugar de Contract.Exists".

Por lo tanto, son equivalentes. Usaré Any en lugar de Exists, por lo que es coherente con el resto de nuestro código.

4

Se prefiere la versión que usa Contract.Exists debido a su naturaleza declarativa. Otra ventaja es que el marco conoce este contrato y tiene más posibilidades de ser "atrapado" en el análisis estático.

+0

¿Puede explicar a qué se refiere con "preferido debido a su naturaleza declarativa"? Además, ¿el análisis estático realmente funciona con los delegados? Esperaría que el hecho de que pueda poner código arbitrario en esa lambda anularía cualquier posible análisis estático. – scobi

Cuestiones relacionadas