.net .net-4.0 code-contracts

¿Cuál es el uso práctico de los Contratos de Código en.NET 4.0?



.net-4.0 code-contracts (4)

Para comprender completamente y aprovechar las nuevas características y mejoras proporcionadas con la llegada del nuevo .NET Framework 4.0, me gustaría obtener un ejemplo de la aplicación en el mundo real de Contratos de Código .

  1. ¿Alguien tiene un buen ejemplo de aplicación de esta función?

Me gustaría obtener una muestra de código con una breve explicación para ayudarme a ponerme en funcionamiento.


¿Alguna vez ha visto una NullReferenceException y desea que el compilador le haya avisado al respecto en el momento de la compilación para evitar descubrirlo de la manera más difícil, con el bloqueo del programa?

Con contratos de código puede escribir cosas como:

Contract.Requires(foo != null);

Esto no es solo un control de tiempo de ejecución: puede configurarlo de modo que si llama a esta función con un argumento que podría ser nulo, obtendrá un error de compilación.

Aquí hay un ejemplo del mundo real:

Address GetAddress(Customer customer) { Contract.Requires<ArgumentNullException>(customer != null, "customer"); return addressBook.FindCustomer(customer); }


Del manual de usuario de contratos de código :

Los contratos le permiten expresar precondiciones, condiciones posteriores e invariantes de objetos en su código para la verificación en tiempo de ejecución, el análisis estático y la documentación.

Los contratos de código se utilizan para la verificación estática ; imagine si, en tiempo de compilación, captó no solo errores de sintaxis sino también errores de lógica . Esta es la visión de la verificación de programa estática.

Ejemplo de mundo real

Podría usar contratos (y verificación estática) para reducir el costo de las pruebas ... en particular las pruebas de regresión. Como ejemplo, digamos que escribo algún código que satisfaga algunas necesidades de negocios ... pero más tarde, el rendimiento necesita cambios, y estoy obligado a optimizarlo. Si primero escribo un contrato, entonces, cuando se verifique mi nuevo código optimizado, si ya no cumple con el contrato original recibiré un mensaje de error en mi IDE, como si tuviera un error de tiempo de compilación. Como resultado, encuentras y resuelves el error casi de inmediato, lo que cuesta menos que una ronda de pruebas.


Hay muchos lugares donde se usan contratos en .Net. >>Sources<<


Hay un capítulo disponible gratuitamente sobre contratos de código en el próximo libro C # in Depth, segunda edición . Por un tipo llamado Jon Skeet, algunos de ustedes pueden estar familiarizados con él :)

En cuanto a uso práctico. Puedes usarlos en cualquier parte de tu código, pero especialmente si estás desarrollando bibliotecas de tipo framework / API que mucha gente usará, espero que sean bastante útiles. La verificación estática de su código ahorra mucho tiempo en comparación con descubrir en tiempo de ejecución que no manejó un caso extremo.

Puede documentar el uso de su método todo lo que quiera, pero ¿la gente realmente leerá esa documentación? ¿Está permitido tener el parámetro de cadena x en el método y ser nulo, o no? Los contratos de código pueden proporcionar esa información, para eliminar las conjeturas de la ecuación.

Aquí hay un ejemplo de tal caso:

static int CountWhitespace(string text) { Contract.Requires<ArgumentNullException>(text != null, "text"); return text.Count(char.IsWhiteSpace); }

La verificación se quejará si alguien intenta pasar una cadena a CountWhitespace que podría ser nula. Además, arrojará una ArgumentNullException en tiempo de ejecución.

Recientemente, he convertido mi biblioteca de clases privada a .NET 4.0, pero planeo agregar contratos de código muy pronto.