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;
}
Gracias Rionmonster, esto era útil! –