2010-05-06 13 views
9

Ich fange gerade an, über die Codeverträge-Bibliothek zu lernen, die mit VS2010 standardmäßig kommt. Eine Sache, auf die ich sofort stoße, ist, was einige der Vertragsklauseln wirklich bedeuten.Wie bringt Contract.Exists Mehrwert?

Zum Beispiel, wie unterscheiden sich diese beiden Aussagen?

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

Mit anderen Worten, was macht Contract.Exists in der Praxis, entweder für einen Entwickler meiner Funktion oder für den statische Analyse Systemcode?

+0

@Chris Pebble, das mögliche Duplikat spricht über den Unterschied zwischen List.Exists zu IEnumerable.Any. Dieser bezieht sich auf Contract.Exists - es ist ein anderer Kontext. – Elisha

+0

Guter Punkt. Entschuldige den Fehler. –

Antwort

1

Ok, ich habe die Antwort gefunden. Gemäß dem Code Contracts Benutzerhandbuch, Abschnitt 2.7.2:

"Es ist auch möglich, die Erweiterungsmethode System.Linq.Enumerable.Any anstelle von Contract.Exists zu verwenden."

So sind sie gleichwertig. Ich werde Any anstelle von Exists verwenden, damit es mit dem Rest unseres Codes konsistent ist.

4

Die Version, die Contract.Exists verwendet, wird aufgrund ihrer deklarativen Natur bevorzugt. Ein weiterer Vorteil ist, dass das Framework diesen Vertrag kennt und eine bessere Chance hat, in der statischen Analyse "gefangen" zu werden.

+0

Können Sie näher erläutern, was Sie mit "wegen seiner deklarativen Natur bevorzugt" meinen? Funktioniert statische Analyse tatsächlich auch mit Delegierten? Ich würde erwarten, dass die Tatsache, dass Sie willkürlichen Code in dieses Lambda einfügen können, jede mögliche statische Analyse zunichte machen würde. – scobi