Aserciones en el código administradoAssertions in Managed Code

Una aserción, o instrucción Assert, prueba una condición especificada como un argumento de dicha instrucción Assert.An assertion, or Assert statement, tests a condition, which you specify as an argument to the Assert statement. Si la condición se evalúa como true, no se produce ninguna acción.If the condition evaluates to true, no action occurs. Si la condición se evalúa como false, se produce un error en la aserción.If the condition evaluates to false, the assertion fails. Si se ejecuta con una compilación de depuración, el programa entra en modo de interrupción.If you are running with a debug build, your program enters break mode.

En este temaIn this topic

Aserciones en el espacio de nombres System.DiagnosticsAsserts in the System.Diagnostics Namespace

Método Debug.AssertThe Debug.Assert method

Efectos secundarios de Debug.AssertSide effects of Debug.Assert

Requisitos de Trace y DebugTrace and Debug Requirements

Argumentos de AssertAssert arguments

Personalización del comportamiento de AssertCustomizing Assert behavior

Establecimiento de aserciones en archivos de configuraciónSetting assertions in configuration files

Aserciones en el espacio de nombres System.DiagnosticsAsserts in the System.Diagnostics Namespace

En Visual Basic y Visual C#, puede utilizar el método Assert de Debug o Trace, que están en el espacio de nombres System.Diagnostics.In Visual Basic and Visual C#, you can use the Assert method from either Debug or Trace, which are in the System.Diagnostics namespace. Los métodos de la clase Debug no se incluyen en una versión de lanzamiento de su programa, de modo que no aumentan el tamaño ni reducen la velocidad de su código de versión.Debug class methods are not included in a Release version of your program, so they do not increase the size or reduce the speed of your release code.

C++ no admite los métodos de la clase Debug.C++ does not support the Debug class methods. Se puede conseguir el mismo efecto mediante la clase Trace con compilación condicional, por ejemplo #ifdef DEBUG...#endif.You can achieve the same effect by using the Trace class with conditional compilation, such as #ifdef DEBUG... #endif.

En este temaIn this topic

Método Debug.AssertThe Debug.Assert method

Utilice el método System.Diagnostics.Debug.Assert libremente para probar condiciones que deberían ser true si el código es correcto.Use the System.Diagnostics.Debug.Assert method freely to test conditions that should hold true if your code is correct. Por ejemplo, suponga que ha escrito una función de división de enteros.For example, suppose you have written an integer divide function. Según las reglas matemáticas, el divisor nunca puede ser cero.By the rules of mathematics, the divisor can never be zero. Puede probarlo mediante una aserción:You might test this using an assertion:

Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
    Debug.Assert(divisor <> 0)
    Return CInt(dividend / divisor)
End Function
int IntegerDivide ( int dividend , int divisor )
{
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor );
}

Cuando se ejecuta 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, de modo que no se produce sobrecarga adicional.When you run this code under the debugger, the assertion statement is evaluated, but in the Release version, the comparison is not made, so there is no additional overhead.

A continuación se muestra otro ejemplo.Here is another example. Se utiliza una clase que implementa una cuenta corriente, de la siguiente manera:You have a class that implements a checking account, as follows:

Dim amount, balance As Double
balance = savingsAccount.balance
Debug.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Antes de retirar dinero de la cuenta, desea asegurarse de que hay saldo suficiente para cubrir la cantidad que se dispone a retirar.Before you withdraw money from the account, you want to make sure that the account balance is sufficient to cover the amount you are preparing to withdraw. Puede escribir una aserción para comprobar el saldo:You might write an assertion to check the balance:

Dim amount, balance As Double
balance = savingsAccount.balance
Trace.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );

Tenga en cuenta que las llamadas al método System.Diagnostics.Debug.Assert desaparecen cuando se crea una versión de lanzamiento del código.Note that calls to the System.Diagnostics.Debug.Assert method disappear when you create a Release version of your code. Esto significa que la llamada que comprueba el saldo desaparecerá en la versión de lanzamiento.That means that the call that checks the balance disappears in the Release version. Para resolver este problema, debe reemplazar System.Diagnostics.Debug.Assert por System.Diagnostics.Trace.Assert, que no desaparece en la versión de lanzamiento:To solve this problem, you should replace System.Diagnostics.Debug.Assert with System.Diagnostics.Trace.Assert, which does not disappear in the Release version:

A diferencia de las llamadas a System.Diagnostics.Trace.Assert, las llamadas a System.Diagnostics.Debug.Assert agregan sobrecarga a la versión de lanzamiento.Calls to System.Diagnostics.Trace.Assert add overhead to your Release version, unlike calls to System.Diagnostics.Debug.Assert.

En este temaIn this topic

Efectos secundarios de Debug.AssertSide effects of Debug.Assert

Cuando utilice System.Diagnostics.Debug.Assert, asegúrese de que el código incluido en Assert no cambia el resultado del programa si se quita Assert.When you use System.Diagnostics.Debug.Assert, make sure that any code inside Assert does not change the results of the program if Assert is removed. De lo contrario, podría producir accidentalmente un error que solo aparezca en la versión de lanzamiento del programa.Otherwise, you might accidentally introduce a bug that only shows up in the Release version of your program. Preste especial atención a las aserciones que contengan llamadas a funciones o procedimientos, como en el ejemplo siguiente:Be especially careful about asserts that contain function or procedure calls, such as the following example:

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

Este uso de System.Diagnostics.Debug.Assert parece seguro a primera vista, pero suponga que cada vez que se llama a la función meas se actualiza un contador.This use of System.Diagnostics.Debug.Assert might appear safe at first glance, but suppose the function meas updates a counter each time it is called. Cuando se compila la versión de lanzamiento, esta llamada a meas se elimina, de manera que no se actualiza el contador.When you build the Release version, this call to meas is eliminated, so the counter does not get updated. Este es un ejemplo de una función con efectos secundarios.This is an example of a function with a side effect. Cuando se elimina una llamada a una función que tiene efectos secundarios podría producirse un error que solo aparece en la versión de lanzamiento.Eliminating a call to a function that has side effects could result in a bug that only appears in the Release version. Para evitar tales problemas, no incluya llamadas a funciones en una instrucción System.Diagnostics.Debug.Assert.To avoid such problems, do not place function calls in a System.Diagnostics.Debug.Assert statement. En su lugar, utilice una variable temporal:Use a temporary variable instead:

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

Aunque se utilice System.Diagnostics.Trace.Assert, conviene no colocar llamadas a funciones dentro de una instrucción Assert.Even when you use System.Diagnostics.Trace.Assert, you might still want to avoid placing function calls inside an Assert statement. Dichas llamadas deben ser seguras, puesto que las instrucciones System.Diagnostics.Trace.Assert no se eliminan en la versión de lanzamiento.Such calls should be safe, because System.Diagnostics.Trace.Assert statements are not eliminated in a Release build. No obstante, si se acostumbra a no usar dichas construcciones, la probabilidad de cometer un error al utilizar System.Diagnostics.Debug.Assert será menor.However, if you avoid such constructs as a matter of habit, you are less likely to make a mistake when you use System.Diagnostics.Debug.Assert.

En este temaIn this topic

Requisitos de Trace y DebugTrace and Debug Requirements

Si crea el proyecto mediante los asistentes de Visual StudioVisual Studio, el símbolo TRACE se define de forma predeterminada en las configuraciones de Release y Debug.If you create your project using the Visual StudioVisual Studio wizards, the TRACE symbol is defined by default in both Release and Debug configurations. El símbolo DEBUG se define de forma predeterminada solo en la versión de depuración.The DEBUG symbol is defined by default only in the Debug build.

De lo contrario, para que funcionen los métodos Trace, el programa debe tener uno de los siguientes símbolos en la parte superior del archivo de código fuente:Otherwise, for Trace methods to work, your program must have one of the following at the top of the source file:

Argumentos de AssertAssert arguments

System.Diagnostics.Trace.Assert y System.Diagnostics.Debug.Assert pueden utilizar hasta tres argumentos.System.Diagnostics.Trace.Assert and System.Diagnostics.Debug.Assert take up to three arguments. El primer argumento, de uso obligatorio, es la condición que se desea comprobar.The first argument, which is mandatory, is the condition you want to check. Si llama a System.Diagnostics.Trace.Assert(Boolean) o System.Diagnostics.Debug.Assert(Boolean) con un único argumento, el método Assert comprueba la condición y, si el resultado es false, envía el contenido de la pila de llamadas a la Ventana de salida.If you call System.Diagnostics.Trace.Assert(Boolean) or System.Diagnostics.Debug.Assert(Boolean) with only one argument, the Assert method checks the condition and, if the result is false, outputs the contents of the call stack to the Output window. En el ejemplo siguiente se muestran System.Diagnostics.Trace.Assert(Boolean) y System.Diagnostics.Debug.Assert(Boolean).The following example shows System.Diagnostics.Trace.Assert(Boolean) and System.Diagnostics.Debug.Assert(Boolean):

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

El segundo y tercer argumento, si existen, deben ser cadenas.The second and third arguments, if present, must be strings. Si llama a System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert con dos o tres argumentos, el primer argumento es una condición.If you call System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert with two or three arguments, the first argument is a condition. El método comprueba la condición y, si el resultado es false, genera la segunda y tercera cadena.The method checks the condition and, if the result is false, outputs the second string and third strings. En el ejemplo siguiente se muestran System.Diagnostics.Debug.Assert(Boolean, String) y System.Diagnostics.Trace.Assert(Boolean, String) utilizados con dos argumentos:The following example shows System.Diagnostics.Debug.Assert(Boolean, String) and System.Diagnostics.Trace.Assert(Boolean, String) used with two arguments:

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

En el ejemplo siguiente se muestran Assert y Assert.The following example shows Assert and Assert:

Debug.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:", "inctemp failed on third call" )
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

En este temaIn this topic

Personalización del comportamiento de AssertCustomizing Assert behavior

Si se ejecuta la aplicación en modo de interfaz de usuario, el método Assert muestra el cuadro de diálogo Error de aserción cuando se produce un error en la condición.If you run your application in user-interface mode, the Assert method displays the Assertion Failed dialog box when the condition fails. La propiedad Listeners o Listeners controla las acciones que tienen lugar cuando se produce un error en una aserción.The actions that occur when an assertion fails are controlled by the Listeners or Listeners property.

Puede personalizar el comportamiento del resultado agregando un objeto TraceListener a la colección Listeners, quitar un objeto TraceListener de la colección Listeners o reemplazar el método System.Diagnostics.TraceListener.Fail de un objeto TraceListener existente para que se comporte de forma diferente.You can customize the output behavior by adding a TraceListener object to the Listeners collection, by removing a TraceListener from the Listeners collection, or by overriding the System.Diagnostics.TraceListener.Fail method of an existing TraceListener to make it behave differently.

Por ejemplo, podría invalidar 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.For example, you could override the System.Diagnostics.TraceListener.Fail method to write to an event log instead of displaying the Assertion Failed dialog box.

Para personalizar el resultado de esta forma, el programa debe contener un agente de escucha, heredar de TraceListener e invalidar su método System.Diagnostics.TraceListener.Fail.To customize the output in this way, your program must contain a listener, and you must inherit from TraceListener and override its System.Diagnostics.TraceListener.Fail method.

Para más información, vea Agentes de escucha de seguimiento.For more Information, see Trace Listeners.

En este temaIn this topic

Establecimiento de aserciones en archivos de configuraciónSetting assertions in configuration files

Se pueden establecer aserciones en el archivo de configuración del programa al igual que en el código.You can set assertions in your program configuration file as well as in your code. Para obtener más información, vea System.Diagnostics.Trace.Assert o System.Diagnostics.Debug.Assert.For more information, see System.Diagnostics.Trace.Assert or System.Diagnostics.Debug.Assert.

Vea tambiénSee also