2010-05-06 1 views
9

Je commence à peine à apprendre à propos de la bibliothèque de contrats de code qui est fournie en standard avec VS2010. Une chose que je vois immédiatement, c'est ce que signifient certaines clauses contractuelles.Comment Contract.Exists ajoute-t-il de la valeur?

Par exemple, comment ces deux instructions sont-elles différentes?

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

En d'autres termes, qu'est-ce que Contract.Exists font en pratique, que ce soit pour un développeur en utilisant ma fonction, ou pour le système d'analyse de code statique?

+0

@Chris Pebble, le duplicata possible parle de la différence entre List.Exists et IEnumerable.Any. Celui-ci est lié à Contract.Exists - c'est un contexte différent. – Elisha

+0

Bon point. Pardonnez l'erreur. –

Répondre

1

Ok, j'ai trouvé la réponse. Selon le Manuel d'utilisation des Contrats de Code, section 2.7.2:

"Il est également possible d'utiliser la méthode d'extension System.Linq.Enumerable.Any au lieu de Contract.Exists."

Donc, ils sont équivalents. Je vais utiliser Any au lieu d'Exists, donc c'est cohérent avec le reste de notre code.

4

La version qui utilise Contract.Exists est préférée en raison de sa nature déclarative. Un autre avantage est que le framework connaît ce contrat et qu'il a plus de chance d'être "pris" dans l'analyse statique.

+0

Pouvez-vous préciser ce que vous entendez par «préféré en raison de sa nature déclarative»? En outre, l'analyse statique fonctionne-t-elle réellement avec les délégués? Je m'attendrais à ce que le fait que vous puissiez mettre du code arbitraire dans ce lambda annule toute analyse statique possible. – scobi

Questions connexes