2012-04-03 19 views
8

Cuando existen Debug.Assert() llamadas de método en el código fuente y compilo en modo de lanzamiento, ¿el compilador genera el IL para el Debug.Assert() aunque no se llame?¿Debug.Assert genera IL en modo de lanzamiento?

Uno de nuestros desarrolladores agregó recientemente un Assert que muestra información sobre nuestra seguridad interna. ¿Podría alguien mirar el modo de liberación IL y descubrir el texto para la afirmación?

+0

Compruebe hacia fuera mi [entrada de blog de edad] (http (cuando DEBUG no está definido.): //tjoe.wordpress .com/2007/12/03/cotw-conditionalattribute-class /), teniendo en cuenta que los métodos 'Debug' están decorados con' [Conditional ("DEBUG")] '. – CodeNaked

Respuesta

9

Hace no de forma predeterminada, a menos que defina el símbolo DEPURAR (y de forma predeterminada, para Liberar que está desactivado).

Para verificar, abra las Propiedades del proyecto y seleccione el panel Generar en Visual Studio. Mostrará la casilla de verificación "Definir DEBUG constante". Si está activado para Liberar, entonces afirma que se disparará; de lo contrario, no lo harán.

7

No, los miembros de la clase Debug (con el atributo ConditionalAttribute) no emiten IL. Hay no explicit mention on MSDN, sin embargo, las siguientes dos citas implican el comportamiento bastante bien, por lo que para aumentar la respuesta de Roy:

Si utiliza métodos de la clase Debug para imprimir información de depuración y comprobar su lógica con las afirmaciones, se puede hacer su código más robusto sin afectar el rendimiento y el tamaño del código de su producto de envío .

Por lo tanto, no hay diferencia de tamaño no implica salida de éstos en absoluto, y

El atributo ConditionalAttribute se aplica a los métodos de depuración. Los compiladores que admiten ConditionalAttribute ignoran las llamadas a estos métodos a menos que "DEBUG" se defina como un símbolo de compilación condicional. Consulte la documentación del compilador para determinar si se admite ConditionalAttribute y la sintaxis para definir un símbolo de compilación condicional .

Lo que significa que, a nivel del compilador, incluso no tener en cuenta estas llamadas

+0

MSDN muestra explícitamente el atributo en la [documentación de nivel de método] (http://msdn.microsoft.com/en-us/library/kssw4w7z.aspx). No dice qué hace el atributo, pero siempre se puede buscar la documentación en el atributo en sí. –

Cuestiones relacionadas