remarks name generate example comentarios c# asp.net .net code-contracts

c# - name - Contratos de código.Net: ¿dónde obtener más información?



xml doc (2)

Los contratos de código se introdujeron en .NET 4.0 y proporcionan un método independiente del lenguaje para expresar los supuestos de codificación en los programas.

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

Desde Microsoft:

  • Comprobación en tiempo de ejecución. Nuestro reescritor binario modifica un programa inyectando 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 una prueba de ejecución una indicación de aprobación / falla. Las herramientas de prueba automática, como Pex, aprovechan los contratos para generar pruebas de unidad más significativas al filtrar los argumentos de prueba sin sentido que no satisfacen las condiciones previas.

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

  • Generación de documentación. Nuestro generador de documentación aumenta los archivos de documentos XML existentes con información del 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.

Aprende más:

Recientemente había escuchado algunas discusiones en mi oficina acerca de los "Contratos" .Net, cuando le pregunté a algunos de mis compañeros de trabajo, ninguno de ellos podía explicarme fácilmente para qué eran o qué eran.

¿Alguien tiene recursos, explicaciones y quizás un tutorial sobre su uso?

Gracias,

Pablo


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

¿Por qué es esto útil?

Bueno, evita que modifiques las variables después de que crees que tu función puede regresar, por lo tanto, potencialmente introduciendo 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 ningún código antes de esa verificación. En el IL generado, el valor de foo se prueba ANTES de la llamada. Es una forma segura de garantizar que su aportación sea la esperada.

El otro, es el 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 varias rutas de salida desde su función ...

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