remarks example cref c# design-by-contract

c# - example - Contrato. Requiere uso



remarks c# (3)

Con un mensaje como este, generalmente es útil especificar exactamente lo que ha hecho.

Por ejemplo, no menciona en el mensaje original si ha instalado el complemento VS, ni que lo ha habilitado en las propiedades de su proyecto, o que realmente se está ejecutando en modo depuración frente a versión, etc.

Re Contract.Requires vs Contract.Requires<Exception>

Contract.Requires es recomendado. De acuerdo con el manual

Si su código debe arrojar una excepción particular en caso de falla de una condición previa particular, puede usar el formulario genérico sobrecargado a continuación. (Lea la Sección 5.1 antes de comprometerse con este formulario en su código. No puede usar Requires < Exn <Exn>> sin ejecutar las herramientas de contrato en todas las compilaciones. Si lo hace, obtendrá un error en el tiempo de ejecución cada vez).

Aquí está mi problema. Soy un gran admirador de Diseño por contrato, estoy usando este concepto especialmente cuando desarrollo bibliotecas que pueden ser utilizadas por otros desarrolladores. Acabo de descubrir una nueva forma de hacerlo, que es: Contract.Requires lugar de Exception : Entonces, en lugar de tener:

public void SomeMethod(string name){ if(name==null) throw new NullArgumentException("Null values not supported"); }

Ahora tengo:

public void SomeMethod(string name){ Contract.Requires(name != null); }

EDITAR : estoy trabajando bajo VS2010 en modo de depuración.

Problema: Contract.Requires no hace nada, ¡incluso cuando el name es null !

La documentación de MSDN dice:

Especifica un contrato de precondición para el método o propiedad adjunto.

¡Pero no se especifica nada en caso de que no se cumpla la condición!

También noté que hay other sobrecargas de Contract.Requires que arrojan una excepción, muestran un mensaje ... pero ¿para qué sirve Contract.Requires(Boolean) ?

EDITAR La respuesta a continuación destacó que se debe instalar un complemento para tener todo el poder de la API de Contract pero ¿qué ocurre con los usuarios de Mono que desean que su código se comporte igual en diferentes plataformas?


De los documentos de clase de contrato :

Importante

Debe instalar un complemento de Visual Studio para hacer cumplir los contratos. El complemento Code Contracts Premium Edition le permite especificar la comprobación estática y en tiempo de ejecución de los contratos de código en la página de propiedades del proyecto. Si no habilita la verificación en tiempo de ejecución, los contratos como el método Contract.Ensures no generarán excepciones durante el tiempo de ejecución si se infringe un contrato. El complemento de Visual Studio no incluye Visual Studio 2010 ni el SDK de Windows.


Debe hacer lo siguiente:

  1. Instale el complemento de Contratos de código como notó nfechner
  2. Vaya a las propiedades del proyecto, carpeta ''Contratos de código''
  3. Marque ''Realizar comprobación del contrato en tiempo de ejecución''
  4. Cambiar ''Modo de montaje'' a ''Contrato estándar requiere''
  5. Sustituya su Contract.Requires Contract.Requires<SomeException> (el primero arroja System.Diagnostics.ContractException mientras que el segundo arroja la excepción especificada que es importante para los métodos públicos)

Esa es la configuración básica. Para una configuración más precisa, consulte el manual

Si usa Mono, probablemente, la clase Contract está vacía. No he hecho esto, pero el capítulo siete del manual Contracts parece explicar cómo proporcionar su propia implementación.