2011-12-15 8 views
10

he empezado a utilizar una clase definir así:Defines.Debug vs DEBUG #if

internal sealed class Defines 
{ 
    /// <summary> 
    /// This constant is set to true iff the define DEBUG is set. 
    /// </summary> 
    public const bool Debug = 
    #if DEBUG 
    true; 
    #else 
    false; 
    #endif 
} 

Las ventajas que veo es:

  1. Asegura que no rompa la materia que, con un #if .. # else .. # endif no sería verificado por el compilador.
  2. Puedo hacer una búsqueda de referencias para ver dónde se usa.
  3. A menudo es útil tener un bool para la depuración, el código define es más largo/más desordenado.

desventaja Posible veo:

compilador no puede optimizar el código no utilizado si la clase definida se encuentra en otro montaje. Por eso he hecho interno.

¿Me faltan otras desventajas?

[Editar] Los ejemplos típicos de uso:

private readonly Permissions _permissions = Defines.Debug ? Permissions.NewAllTrue() 
                  : Permissions.NewAllFalse(); 

O:

var str = string.Format(Defines.Debug ? "{0} {1} ({2})" : "{0} {1}", actual, text, advance); 
+6

¿Ha mirado el ['ConditionalAttribute'] (http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx) en absoluto? – Oded

+0

@Oded Gracias, he agregado ejemplos típicos, solo pequeñas modificaciones en líneas únicas, no métodos completos o clases en las que la ConditionalAttribute se ajusta, o simplemente no debería ser tan vago y definir dos métodos para estas líneas. – weston

+1

¿Qué sucede si el ensamblado que contiene esto está construido en 'Debug' pero aquellos que lo hacen referencia están construidos en' Release'? – Oded

Respuesta

6

Veo por lo menos una gran desventaja: si Debug es falso, este código hará una advertencia:

if (Debug) 
    Console.WriteLine("Debug"); 

Porque el compilador detectará que la condición nunca se cumple, por lo que el Console.WriteLine llamada es inalcanzable.

+0

Oh sí, eso es muy molesto. Creo que miraré la sugerencia de @Oded entonces. – weston