Я только начинаю узнавать о библиотеке контрактов кода, которая приезжает стандарт с VS2010. Одна вещь, с которой я сталкиваюсь сразу же, - то, что действительно означают некоторые пункты контракта.
Например, как эти два оператора отличаются?
Contract.Requires(!mycollection.Any(a => a.ID == newID));
Contract.Requires(!Contract.Exists(mycollection, a => a.ID == newID));
Другими словами, что действительно Сокращается. Существует делают в практических целях, или для разработчика, использующего мою функцию, или для статической системы анализа кода?
Хорошо, я нашел ответ. Согласно Руководству пользователя Code Contracts, раздел 2.7.2:
«Также можно использовать метод расширения System.Linq.Enumerable.Any вместо Contract.Exists».
Таким образом, они эквивалентны. Я буду использовать Any вместо Exists, чтобы он соответствовал остальной части нашего кода.
Версия, использующая Contract.Exists
, предпочтительнее из-за своей декларативности. Другим преимуществом является то, что фреймворк знает этот контракт, и у него больше шансов быть "пойманным" при статическом анализе.