2011-12-09 10 views

Respuesta

25

Code Contracts se introdujeron en .NET 4.0 y proporcionan un método independiente del idioma para expresar supuestos de codificación de programas.

Básicamente, le permiten verificar condiciones previas, condiciones posteriores y otras características y pueden mejorar en gran medida el proceso de prueba y la calidad final del código que se está escribiendo.

De Microsoft:

  • Runtime Comprobación. Nuestro reescritor binario modifica un programa al inyectar los contratos, que se verifican como parte de la ejecución del programa. Los programas reescritos mejoran la capacidad de prueba: cada contrato actúa como un oráculo, dando a la prueba una indicación de aprobación/reprobación. Las herramientas de prueba automáticas, como Pex, aprovechan los contratos para generar pruebas unitarias más significativas al filtrar los argumentos de pruebas sin sentido que no satisfacen las condiciones previas.

  • Comprobación estática. ¡Nuestro verificador estático puede decidir si hay violaciones de contrato sin siquiera ejecutar el programa! Comprueba los contratos implícitos, como las dereferencias nulas y los límites de la matriz, así como los contratos explícitos.

  • Documentation Generation. Nuestro generador de documentación aumenta los archivos XML doc existentes con información de contrato. También hay nuevas hojas de estilo que se pueden usar con Sandcastle para que las páginas de documentación generadas tengan secciones de contrato.

obtener más información:

+0

Gracias Rionmonster, esto era útil! –

17

contratos de código son una forma relativamente nueva de realizar controles sobre la entrada y salida de las funciones. Donde se diferencian de su estándar Assert, la comprobación de tipo es que el IL generado que verifica la entrada lo verifica directamente antes de que se llame a la función, y el código que verifica la salida, después de que su función haya salido realmente.

¿Por qué es esto útil?

Bueno, le impide modificar las variables después de que crea que su función puede regresar, lo que podría introducir errores.

Aquí hay un ejemplo.

public void doSomething(SomeObject foo) 
{ 
    Contract.Requires<ArgumentNullException>(foo != null); 
} 

Ahora, los contratos de código requieren que no haya código antes de esa comprobación. En el IL generado, el valor de foo se prueba ANTES de la llamada. Es una forma segura de garantizar que su contribución sea la esperada.

La otra, es la construcción Contract.Ensures. Esto es básicamente como Requires, pero opera en su valor de retorno.

public int doSomethingElse() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    int ret = 1; 
    return ret; 
} 

Esto sería particularmente útil si tuviera múltiples vías de salida de la función ...

public int someBadFunction() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    if(....) 
    { 
     if(....) return 2; 
     if(....) return 8; 
    } 
    return 3; 
} 
Cuestiones relacionadas