Compartir a través de


Aserciones en código administrado

Una aserción, o instrucción Assert, prueba una condición especificada como un argumento de dicha instrucción Assert. Si la condición se evalúa como true, no se produce ninguna acción. Si la condición se evalúa como false, se produce un error en la aserción. Si está ejecutando una compilación de depuración, el programa entra en modo de interrupción.

En este tema

Aserciones en el espacio de nombres System.Diagnostics

Método Debug.Assert

Efectos secundarios de Debug.Assert

Requisitos de seguimiento y depuración

Aserción de argumentos

Personalización del comportamiento de aseveración

Establecimiento de aserciones en archivos de configuración

Aserciones en el namespace System.Diagnostics

En Visual Basic y Visual C#, se puede usar el método Assert desde Debug o Trace, que están en el namespace System.Diagnostics. Debug Los métodos de clase no se incluyen en una versión de lanzamiento del programa, por lo que no aumentan el tamaño ni reducen la velocidad del código de versión.

C++ no admite los métodos de Debug clase. Puede lograr el mismo efecto mediante la Trace clase con compilación condicional, como #ifdef DEBUG... #endif.

En este tema

Método Debug.Assert

Utilice el método System.Diagnostics.Debug.Assert libremente para probar condiciones que deberían ser true si el código es correcto. Por ejemplo, supongamos que ha escrito una función de división de enteros. Según las reglas matemáticas, el divisor nunca puede ser cero. Puede probar esto mediante una aserción:

int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

Al ejecutar este código en el depurador, se evalúa la instrucción de aserción, pero en la versión de lanzamiento, no se realiza la comparación, por lo que no hay ninguna sobrecarga adicional.

Este es otro ejemplo. Tiene una clase que implementa una cuenta de comprobación, como se indica a continuación:

float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Antes de retirar dinero de la cuenta, quieres asegurarte de que el saldo de la cuenta sea suficiente para cubrir la cantidad que planeas retirar. Puede escribir una aserción para comprobar el saldo:

float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Tenga en cuenta que las llamadas al System.Diagnostics.Debug.Assert método desaparecen al crear una versión de lanzamiento del código. Esto significa que la llamada que comprueba el saldo desaparece en la versión de lanzamiento. Para solucionar este problema, debe reemplazar System.Diagnostics.Debug.Assert por System.Diagnostics.Trace.Assert, que no desaparece en la versión de lanzamiento.

Las llamadas a System.Diagnostics.Trace.Assert añaden sobrecarga a tu versión de Release, a diferencia de las llamadas a System.Diagnostics.Debug.Assert.

En este tema

Efectos secundarios de Debug.Assert

Cuando use System.Diagnostics.Debug.Assert, asegúrese de que cualquier código dentro Assert no cambie los resultados del programa si Assert se quita. De lo contrario, es posible que introduzca accidentalmente un error que solo aparezca en la versión de lanzamiento del programa. Tenga especial cuidado con las aserciones que contienen llamadas a funciones o procedimientos, como el ejemplo siguiente:

// unsafe code
Debug.Assert (meas(i) != 0 );

Este uso de System.Diagnostics.Debug.Assert podría parecer seguro a primera vista, pero supongamos que la función meas actualiza un contador cada vez que se llama. Al compilar la versión de lanzamiento, se elimina esta llamada a meas, por lo que el contador no se actualiza. Este es un ejemplo de una función con un efecto secundario. Eliminar una llamada a una función que tiene efectos secundarios podría dar lugar a un error que solo aparece en la versión de lanzamiento. Para evitar estos problemas, no utilice llamadas de función en una System.Diagnostics.Debug.Assert instrucción. Use una variable temporal en su lugar:

temp = meas( i );
Debug.Assert ( temp != 0 );

Incluso cuando uses System.Diagnostics.Trace.Assert, puede que todavía quieras evitar colocar llamadas de función dentro de una instrucción Assert. Estas llamadas deben ser seguras, ya que System.Diagnostics.Trace.Assert las declaraciones no se eliminan en una compilación de lanzamiento. Sin embargo, si evita estas construcciones como cuestión de hábito, es menos probable que se produzca un error al usar System.Diagnostics.Debug.Assert.

En este tema

Requisitos de seguimiento y depuración

Si crea el proyecto mediante los asistentes de Visual Studio, el símbolo TRACE se define de forma predeterminada en configuraciones de versión y depuración. El símbolo DEBUG se define de forma predeterminada solo en la compilación Debug.

De lo contrario, para que los métodos funcionen con Trace, el programa debe tener uno de los siguientes elementos en la parte superior del archivo de origen.

Aserción de argumentos

System.Diagnostics.Trace.Assert y System.Diagnostics.Debug.Assert pueden aceptar hasta tres argumentos. El primer argumento, que es obligatorio, es la condición que desea comprobar. Si llama a System.Diagnostics.Trace.Assert(Boolean) o System.Diagnostics.Debug.Assert(Boolean) con un solo argumento, el método Assert comprueba la condición y, si el resultado es falso, genera el contenido de la traza de llamadas en la ventana Salida. En el ejemplo siguiente se muestra System.Diagnostics.Trace.Assert(Boolean) y System.Diagnostics.Debug.Assert(Boolean):

Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );

Los argumentos segundo y tercero, si están presentes, deben ser cadenas. Si llama a System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert con dos o tres argumentos, el primer argumento es una condición. El método comprueba la condición y, si el resultado es false, genera la segunda cadena y la tercera cadena. En el ejemplo siguiente se muestra System.Diagnostics.Debug.Assert(Boolean, String) y System.Diagnostics.Trace.Assert(Boolean, String) se usa con dos argumentos:

Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );

En el ejemplo siguiente se muestra System.Diagnostics.Debug.Assert(Boolean, String, String) y System.Diagnostics.Trace.Assert(Boolean, String, String) se usa con tres argumentos:

Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

En este tema

Personalización del comportamiento de assert

Si ejecuta la aplicación en modo de interfaz de usuario, el Assert método muestra el cuadro de diálogo Error de aserción cuando se produce un error en la condición. Las acciones que se producen cuando se produce un error en una aserción se controlan mediante la Listeners propiedad o Listeners .

Puede personalizar el comportamiento de salida agregando un TraceListener objeto a la Listeners colección, quitando un TraceListener elemento de la Listeners colección o reemplazando el System.Diagnostics.TraceListener.Fail método de un existente TraceListener para que se comporte de forma diferente.

Por ejemplo, podría sobrescribir el método System.Diagnostics.TraceListener.Fail para escribir en un registro de eventos en lugar de mostrar el cuadro de diálogo Error de aserción.

Para personalizar la salida de esta manera, el programa debe contener un agente de escucha, y debe heredar de TraceListener y sobrescribir su método System.Diagnostics.TraceListener.Fail.

Para obtener más información, consulte Escuchas de seguimiento.

En este tema

Establecimiento de aserciones en archivos de configuración

Puede establecer aserciones en el archivo de configuración del programa, así como en el código. Para obtener más información, vea System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert.