2011-07-14 15 views

Odpowiedz

31

The user manual wyjaśnia to z dużą ilością szczegółów - są różne opcje, które możesz mieć. Każda konfiguracja kompilacji może mieć inne ustawienia, dla których kontrakty są sprawdzane w czasie wykonywania, i nie jest to wybór "wszystko albo nic" - można wymusić wszystkie, niektóre lub żadne z umów, na podstawie ustawień, które można zmodyfikować w Visual Studio.

3

We właściwościach projektu przejdź do Umowy kodu, wybierz konfigurację "Zwolnienie" i usuń zaznaczenie pola wyboru Sprawdzanie w czasie wykonywania.

12

Mam moje ulubione opcje opisane on my blog.

Podsumowując:

  • W trybie Release, polecam odznaczając Wykonaj Runtime kontraktu Sprawdzanie ale wybierając zbudować Contract Assembly Reference. Spowoduje to umieszczenie warunków wstępnych w osobnej bibliotece dll, z której klienci mogą opcjonalnie korzystać (jeśli sprawdzają stronę wymagającą sprawdzania na stronie połączenia), ale usuwa wszystkie koszty ogólne, jeśli nie sprawdzają tej opcji.
  • W trybie debugowania ustaw opcję Wykonaj sprawdzanie kontraktu wykonawczego na pełne.

Niektórzy ludzie wolą, aby warunki wstępne zostały uwzględnione w ich wydaniu. Jest to szczególnie przydatne w przypadku dystrybucji za pośrednictwem NuGet, ponieważ they don't support Code Contract dlls. W przypadku pakietów NuGet migruję w kierunku uwzględnienia warunków wstępnych w kompilacjach wydań, ale mam też osobne pobieranie dla wersji "Release without Preconditions".

6

Różnica w wydajności jest niewielka i nie wpływa na Twój kod w zauważalny sposób. Chyba, że ​​rozwijasz jakiś system handlu akcjami w czasie rzeczywistym, naprawdę nie martwiłbym się o to.

O ile wyłączenie kodu w produkcji, wolałbym raczej mieć dodatkową ochronę kontraktów kodu zamiast jakiegoś prawdopodobnie niejasnego błędu. Błąd w umowie o kodeks powie dokładnie, gdzie i dlaczego kontrakt został naruszony, a nie musiał kopać w jakiś głęboki stos wywoławczy tylko dlatego, że niektóre złe dane zostały przekazane na 5 poziomach w górę drzewa stosu wywołań.

@svanryckeghem i @Stephen Cleary: Jeśli używasz lub zamierzasz korzystać Contract.Requires<TException> i nie pozwalają „Runtime kontraktu Sprawdzanie”, otrzymasz awarię wykonawczego o rewriter (IL), która chciałaby ccrewrite.exe być zobowiązani do korzystania z umów kodowych. Będziesz wówczas musiał włączyć sprawdzanie kontraktów Runtime, aby to działało.

IMHO, użycie Contract.Requires<TException>() jest o wiele bardziej przydatne niż Contract.Requires(), ponieważ masz kontrolę nad typem zgłaszanego wyjątku.

+0

'Contract.Requires ()', nie zgadzam się, że jest to bardziej przydatne, myślę, że jest to coś więcej niż coś starego - w ogóle go nie używam. Kontrakt wymaga prawie wszystkich argumentów wyjątkowych tego rodzaju, a warunek boolowski jest wystarczającą informacją; jeśli odpowiednio zaprojektujesz rzeczy. "Kontrakty" to nie tylko inny sposób robienia 'wyjątków', wymagają innego podejścia. – nicodemus13

+4

Fraza operacyjna w twoim komentarzu to "... prawie wszystkie wyjątki od argumentów ...". Nie chcę tworzyć umów opartych na "prawie". Jeśli mogę zagwarantować, że wszystkie są tego samego rodzaju wyjątków, to tak, używając umowy.Wymaga () jest zbędny. Jednak nie jest to gwarantowane i wolałbym objąć wszystkie scenariusze - szczególnie te skrajne - w przeciwnym razie twoje umowy stałyby się niczym więcej niż spekulacjami. –

Powiązane problemy