2012-01-30 11 views
11

Anteriormente vi un hilo en StackOverflow que contenía cierta discusión al respecto, ¡pero no puedo encontrarlo de nuevo!Uso de System.Diagnostics.Contract en Release compilaciones

Estoy interesado en saber si las clases System.Diagnostics.Contract se deben usar en 'código real', es decir, una compilación de lanzamiento del código de producción? Lo pregunto porque, según la descripción del espacio de nombres, parece que el Contrato está destinado a la depuración o al análisis.

Parece una biblioteca útil donde las condiciones pre/post para la funcionalidad son importantes, y puede evitar el esfuerzo de escribir muchas verificaciones if/then/else, de ser así, ¿hay alguna alternativa en las bibliotecas centrales?

+1

No coloque los títulos con "C#" y tal. Para eso son las etiquetas. –

Respuesta

11

Sección 5.1 (Argumento Validación y contratos) de la documentation detalla las tres principales modos de uso que podría considerar para el uso de los contratos: la validación

  1. Argumento a través de contratos sólo en versiones de depuración, no en generaciones de lanzamiento.
  2. Validación también en versiones de versión.
  3. Validación de argumento personalizado en compilaciones de Release, Contratos solo en compilaciones de Depuración.

Por lo tanto, hay al menos un modo de uso en el que utilizaría Contratos en compilaciones de versión, al menos como lo hace la documentación oficial.

Cita:

Antes de empezar a usar contratos en su propio código, es necesario tomar algunas decisiones que las formas de influir en lo contrato para usar para la validación de argumentos y donde (ver Figura 2). Tenga en cuenta que puede tomar estas decisiones de forma independiente para cada ensamblaje administrado que produzca (cada proyecto):

El uso más fácil de las herramientas contractuales es si decide que no necesita realizar validación de argumentos en tiempo de ejecución en compilaciones de lanzamiento (Uso 1). En ese caso, usa las herramientas de contrato durante el desarrollo, pero no en los bits enviados. Recuerde, puede enviar un ensamblaje de referencia de contrato junto con los bits de su versión para que los clientes puedan obtener la verificación del tiempo de ejecución de sus validaciones de parámetros en sus compilaciones de depuración a través de call-site requiere verificación.

El segundo método más sencillo si necesita validación de argumentos en su versión de lanzamiento es activar la verificación de contratos en todas las construcciones (Uso 2). Por lo tanto, aproveche las herramientas para producir las cadenas de tiempo de ejecución de sus condiciones y para realizar la herencia del contrato por usted. Puede elegir producir excepciones específicas para sus validaciones de parámetros, o tener la ContractException predeterminada. El riesgo de utilizar las herramientas de contrato en su compilación de lanzamiento es que depende de herramientas que no han alcanzado el nivel de calidad de producción.

La combinación más complicada es cuando desea validación de argumentos en compilaciones de lanzamiento, pero está utilizando la herramienta de contrato para el tiempo de ejecución que solo verifica compilaciones de depuración, pero no en la compilación de lanzamiento (Uso 3). En ese caso, debe continuar escribiendo la validación de su argumento de la manera en que ya lo hace, es decir, usar declaraciones if-then-throw (las llamamos legacy-requires). Si desea que estos sean herramientas detectables, agregue otros contratos (como Garantías) después de ellos, o use Contract.EndContractBlock(), si no hay otros contratos presentes. Tenga en cuenta que dado que no está utilizando las herramientas de comprobación de tiempo de ejecución en la compilación de lanzamiento, no va a obtener ninguna herencia de contratos y debe repetir manualmente sus requisitos heredados en las sustituciones y las implementaciones de interfaz.Para los métodos de interfaz y abstractos, aún obtiene la mayor cantidad de benet si escribe clases contractuales con requisitos normales y asegura los formularios para que revise sus compilaciones de depuración y aparezcan en ensambles de referencia de contratos y, por lo tanto, sean visibles para los proyectos dependientes y los inspectores estáticos.

Esto también insinúa cuál sería la alternativa utilizando solo las otras partes del marco: La forma habitual de usar if-then-throw.

Cuestiones relacionadas