2011-07-31 14 views
7

Parece que sería ideal (en términos de legibilidad) usar, por ejemplo, Debug.WriteLine para escribir en la salida en lugar de una tonelada de instrucciones #if DEBUG.C# ¿Las sentencias Debug se compilan cuando se ejecuta en modo Release?

Cuando el programa se compila en modo de lanzamiento, ¿todos los gastos generales con el Debug.WriteLine desaparecen como si no existieran, o aún se invoca la función, pero no se hace nada internamente?

Si es así, ¿hay alguna forma de obtener esta funcionalidad en una clase personalizada, es decir, una llamada estática solo se compilaría si estamos en modo Depuración?

Respuesta

14

Se llama ConditionalAttribute y ya está allí: Debug.WriteLine() las llamadas se eliminan por completo cuando se compila en modo Release.

se declara así:

[ConditionalAttribute("DEBUG")] 
public static void WriteLine(string message) 

por lo que cualquier llamadas a ella se eliminan si el símbolo DEBUG no se declara, por ejemplo, en la configuración por defecto de una versión de lanzamiento. (Puede cambiar los símbolos del preprocesador definidos para las distintas configuraciones de compilación en las propiedades del proyecto).

Lo mismo ocurre con (¿casi?) Todos los métodos en Debug. De hecho, es la principal diferencia entre Debug y Trace - Los métodos de Trace también se mantienen en versión.

+2

No fue una respuesta, pero incluso si no conocía el atributo condicional y puso el método completo en #if debug, se optimizaría. http://stackoverflow.com/questions/11783/in-net-will-empty-method-calls-be-optimized-out –

+2

@mootinator: Bueno, no es lo mismo. Con 'Coditional', todo se descarta en el momento de la compilación. Con el método vacío, JITter todavía tiene que analizar cosas en tiempo de ejecución, lo que reduce el rendimiento. No mucho, pero de todos modos. De esta forma, por el contrario, JITter nunca vería esta llamada de método en absoluto. –

+0

Tenga en cuenta que si realiza una concatenación de cadenas loca antes de pasarla a Debug.Write/WriteLine, la concatenación de cadenas se incluirá en la versión de lanzamiento. Si coloca su lógica de concatenación dentro de la función, se eliminará. Por lo tanto, puede hacer su cadena concat de la siguiente manera: Debug.WriteLine (DoHugeStringCalculation()); .. de otra manera puede usar #if DEBUG alrededor de todo. –

Cuestiones relacionadas