contratti codice sono relativamente nuovo modo di effettuare controlli di ingresso e di uscita delle funzioni. Nei casi in cui differiscono dal controllo di tipo standard Assert
, l'IL generato che controlla l'input lo controlla direttamente prima che la funzione venga chiamata e il codice che controlla l'output, dopo che la funzione è effettivamente uscita.
Perché è utile?
Bene, impedisce di modificare le variabili dopo aver pensato che la funzione potrebbe tornare, introducendo quindi potenziali bug.
Ecco un esempio.
public void doSomething(SomeObject foo)
{
Contract.Requires<ArgumentNullException>(foo != null);
}
Ora, i Contratti di codice richiedono che non ci sia alcun codice prima di tale controllo. Nell'IL generato, il valore di foo
viene testato PRIMA della chiamata. È un modo infallibile per garantire che l'input sia come previsto.
L'altro è il costrutto Contract.Ensures
. Questo è fondamentalmente come Requires
ma opera sul tuo valore di ritorno.
public int doSomethingElse()
{
Contract.Ensures(Contract.Result<int>() != 0);
int ret = 1;
return ret;
}
Ciò sarebbe particolarmente utile se si ha più percorsi di uscita dalla vostra funzione ...
public int someBadFunction()
{
Contract.Ensures(Contract.Result<int>() != 0);
if(....)
{
if(....) return 2;
if(....) return 8;
}
return 3;
}
fonte
2011-12-09 16:49:42
Grazie Rionmonster, questo è stato utile! –