2011-12-09 9 views
21

Recentemente ho avuto qualche discussione nel mio ufficio sui "Contratti" .Net, tuttavia, quando ho chiesto ad alcuni dei miei colleghi, non di loro potevano facilmente spiegarmi a cosa servissero o cosa fossero.. Contratti di codice Net - Dove saperne di più?

Qualcuno ha risorse, spiegazioni e forse un tutorial sul loro utilizzo?

Grazie,

Paul

risposta

25

Code Contracts sono state introdotte in .NET 4.0 e forniscono un metodo indipendente dal linguaggio per esprimere la codifica ipotesi nei programmi.

Fondamentalmente consentono di verificare pre-condizioni, post-condizioni e altre funzionalità e possono migliorare notevolmente il processo di test e l'eventuale qualità del codice che viene scritto.

Da Microsoft:

  • Runtime Controllo. Il nostro reporter binario modifica un programma iniettando i contratti, che vengono controllati come parte del programma> esecuzione. Programmi riscritti migliorano la testabilità: ogni contratto funge da oracolo, dando a un test eseguito un'indicazione pass/fail. Gli strumenti di test automatici, come Pex, sfruttano i contratti per generare test unitari più significativi filtrando argomenti di test privi di significato che non soddisfano le condizioni preliminari.

  • Controllo statico. Il nostro controllore statico può decidere se ci sono violazioni del contratto senza nemmeno eseguire il programma! Controlla i contratti impliciti, come le dereferenze nulle e i limiti degli array, nonché i contratti espliciti.

  • Generazione di documentazione. Il nostro generatore di documentazione aumenta file di documenti XML esistenti con informazioni sul contratto. Ci sono anche nuovi fogli di stile che possono essere usati con Sandcastle in modo che le pagine di documentazione generate abbiano sezioni di contratto.

Per saperne di più:

+0

Grazie Rionmonster, questo è stato utile! –

17

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; 
} 
Problemi correlati