Kontrakty Code to stosunkowo nowy sposób przeprowadzania kontroli na wejściu i wyjściu z funkcji. Tam, gdzie różnią się one od standardowego sprawdzania typu, jest to, że wygenerowany il sprawdzający dane wejściowe sprawdza go bezpośrednio przed wywołaniem funkcji, a kod, który sprawdza wyjście, po tym, jak twoja funkcja rzeczywiście się zakończyła.
Dlaczego ta funkcja jest przydatna?
Cóż, zapobiega modyfikowaniu zmiennych po tym, jak uważasz, że funkcja może powrócić, co potencjalnie może spowodować błędy.
Oto przykład.
public void doSomething(SomeObject foo)
{
Contract.Requires<ArgumentNullException>(foo != null);
}
Kontrakt Code wymaga, aby przed tą kontrolą nie było żadnego kodu. W wygenerowanym IL wartość foo
jest testowana przed wywołaniem. Jest to pewny sposób na zapewnienie, że twoje dane wejściowe są zgodne z oczekiwaniami.
Drugi, to konstrukcja Contract.Ensures
. Jest to zasadniczo jak Requires
, ale działa na podstawie wartości zwracanej.
public int doSomethingElse()
{
Contract.Ensures(Contract.Result<int>() != 0);
int ret = 1;
return ret;
}
Byłoby to szczególnie przydatne, gdy trzeba było wiele ścieżek wyjścia ze swojej funkcji ...
public int someBadFunction()
{
Contract.Ensures(Contract.Result<int>() != 0);
if(....)
{
if(....) return 2;
if(....) return 8;
}
return 3;
}
Dzięki Rionmonster, to było pomocne! –