C# - ¿Qué hace el método Assert ()? ¿Sigue siendo útil?


Estoy depurando con puntos de interrupción y me doy cuenta de la llamada assert? Pensé que era sólo para pruebas unitarias. ¿Qué hace más que punto de interrupción? Ya que puedo breakpoint, ¿por qué debo usar Assert?

 125
Author: PeterVermont, 2008-10-02

9 answers

En una compilación de depuración, Assert toma una condición booleana como parámetro y muestra el diálogo de error si la condición es falsa. El programa procede sin ninguna interrupción si la condición es verdadera.

Si compilas en Release, todos Debug.Assert's se dejan automáticamente fuera.

 165
Author: Patrick Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-21 09:58:15

Desde Código completo

8 Programación defensiva

8.2 Aserciones

Una aserción es código que se usa durante el desarrollo, generalmente una rutina o macro-que permite que un programa se compruebe a sí mismo mientras se ejecuta. Cuando un la afirmación es cierta, eso significa que todo está funcionando como se esperaba. Cuando es falso, significa que ha detectado un error inesperado en el codificar. Por ejemplo, si el sistema asume que un cliente-información archivo nunca tendrá más de 50.000 registros, el programa podría contener una afirmación de que el número de registros es menor o igual a 50.000. Siempre y cuando el número de registros sea menor o igual a 50.000, la afirmación será silenciosa. Si encuentra más de 50,000 registros, sin embargo, en voz alta "afirmará" que hay un error en el programa.

Las aserciones son especialmente útiles en programas grandes y complicados y en programas de alta fiabilidad. Permiten a los programadores más pronto eliminar suposiciones de interfaz no coincidentes, errores que se arrastran cuando el código se modifica, y así sucesivamente.

Una aserción usualmente toma dos argumentos: una expresión booleana que describe la suposición que se supone que es verdad y un mensaje para mostrar si no lo es.

(…)

Normalmente, no desea que los usuarios vean mensajes de aserción en código de producción; las aserciones son principalmente para su uso durante el desarrollo y mantenimiento. Las afirmaciones son normalmente compilado en el código tiempo de desarrollo y compilado fuera del código para la producción. Durante el desarrollo, las afirmaciones eliminan las suposiciones contradictorias, condiciones inesperadas, malos valores pasados a las rutinas, etc. Durante la producción, se compilan fuera del código para que el las aserciones no degradan el rendimiento del sistema.

 81
Author: juan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-10 03:55:02

Debe usarlo para los momentos en que no desea tener que marcar cada pequeña línea de código para verificar las variables, pero sí desea obtener algún tipo de retroalimentación si ciertas situaciones están presentes, por ejemplo:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
 34
Author: thelsdj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 17:31:13

Assert también le da otra oportunidad para reírse de las habilidades de diseño de interfaz de usuario de Microsoft. Quiero decir: un diálogo con tres botones Abortar, Reintentar, Ignorar, y una explicación de cómo interpretarlos en la barra de título!

 11
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 17:33:02

Assert le permite afirmar una condición (post o pre) que se aplica en su código. Es una forma de documentar sus intenciones y hacer que el depurador le informe con un diálogo si su intención no se cumple.

A diferencia de un punto de interrupción, la afirmación va con su código y se puede usar para agregar detalles adicionales sobre su intención.

 8
Author: Jeff Yates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 17:26:03

Assert puede ayudarlo a proporcionar un comportamiento de mensajería separado entre la prueba y la publicación. Por ejemplo,

Debug.Assert(x > 2)

Solo activará una interrupción si está ejecutando una compilación de "depuración", no una compilación de lanzamiento. Hay un ejemplo completo de este comportamiento aquí

 8
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 17:27:53

En primer lugar, el método Assert() está disponible para las clases Trace y Debug.
Debug.Assert() se ejecuta solo en modo de depuración.
Trace.Assert() se ejecuta en modo de depuración y liberación.

Aquí hay un ejemplo:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

Ejecute este código en modo Debug y luego en modo Release.

introduzca la descripción de la imagen aquí

Notará que durante el modo de depuración falla su instrucción code Debug.Assert, obtendrá un cuadro de mensaje que muestra el seguimiento de pila actual de la aplicación. Esto no es sucediendo en modo Release desde Trace.Assert() la condición es verdadera (i == 4).

WriteLine() el método simplemente le da la opción de registrar la información en la salida de Visual Studio. introduzca la descripción de la imagen aquí

 4
Author: Serge Voloshenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 19:12:25

La forma en que lo pienso es Depurar.Assert es una forma de establecer un contrato sobre cómo se supone que debe llamarse un método, centrándose en detalles sobre los valores de un parámetro (en lugar de solo el tipo). Por ejemplo, si se supone que no debe enviar un null en el segundo parámetro, agregue la afirmación alrededor de ese parámetro para decirle al consumidor que no lo haga.

Evita que alguien use su código de una manera estúpida. Pero también permite que la forma cabeza de hueso para ir a través de producción y no dar el mensaje desagradable a un cliente (suponiendo que construir una versión de compilación).

 3
Author: Flory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 17:51:41

Las afirmaciones aparecen fuertemente en Design by Contract (DbC) que, según tengo entendido, fue introducido/respaldado por Meyer, Bertand. 1997. Construcción de Software Orientado a Objetos.

Una característica importante es que no deben producir efectos secundarios, por ejemplo, puede manejar una excepción o tomar un curso de acción diferente con una instrucción if(programación defensiva).

Las aserciones se utilizan para comprobar las condiciones pre/post del contrato, la relación cliente / proveedor - el cliente debe asegurarse de que se cumplen las condiciones previas del proveedor, por ejemplo. envía £5 y el proveedor debe asegurarse de que se cumplan las condiciones posteriores, por ejemplo. entrega 12 rosas. (Solo una explicación simple de cliente / proveedor - puede aceptar menos y entregar más, pero sobre Afirmaciones). C# también introduce Trace.Assert (), que se puede usar para el código de liberación.

Para responder a la pregunta sí siguen siendo útiles, pero pueden añadir complejidad+legibilidad al código y tiempo+difícil de mantener. ¿Deberíamos seguir usándolas? Sí, Ser ¿todos los usamos? Probablemente no, o no en la medida en que Meyer lo describe.

(Incluso el curso de Java de OU en el que aprendí esta técnica solo mostró ejemplos simples y el resto del código no aplicó las reglas de aserción de DbC en la mayor parte del código, ¡pero se asumió que se usaba para asegurar la corrección del programa!)

 3
Author: Knightlore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 21:03:42