Conditional (Guía de programación de C#)

Actualización: noviembre 2007

Realiza la ejecución de un método que depende de un identificador de preprocesamiento. El atributo Conditional es un alias para ConditionalAttribute y se puede aplicar a un método o a una clase de atributo.

En este ejemplo, Conditional se aplica a un método para habilitar o deshabilitar la presentación de información de diagnóstico específica del programa:

#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}

Si no se define el identificador TRACE_ON, no se mostrará ningún resultado de seguimiento.

El atributo Conditional se utiliza a menudo con el identificador DEBUG para habilitar las características de rastreo y registro en las versiones de depuración, pero no en las versiones de lanzamiento, como se indica a continuación:

[Conditional("DEBUG")]
static void DebugMethod()
{
}

Comentarios

Cuando se llama a un método marcado como condicional, la presencia o ausencia del símbolo de preprocesamiento especificado determina si la llamada se incluye o se omite. Si el símbolo se define, la llamada se incluye; en caso contrario, la llamada se omite. El uso de Conditional es una alternativa más limpia, elegante y menos propensa a errores que agregar métodos dentro de #if y #endif, como se indica a continuación:

#if DEBUG
void ConditionalMethod()
{
}
#endif

Un método condicional debe ser un método en una clase o declaración de estructura y debe tener un tipo de valor devuelto void.

Uso de varios identificadores

Si un método presenta varios atributos Conditional, se incluye una llamada al método en el caso de que al menos uno de los símbolos condicionales esté definido (es decir, los símbolos están conectados mediante una operación lógica OR). En este ejemplo, la presencia de A o de B tendrá como resultado la llamada a un método:

[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

Para conseguir el efecto de una operación lógica AND entre símbolos, se pueden definir métodos condicionales en serie. Por ejemplo, el segundo método que se expone a continuación sólo se ejecutará si se definen A y B:

[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}

Uso de Conditional con clases de atributo

El atributo Conditional también se puede aplicar a una definición de clase de atributo. En este ejemplo, el atributo personalizado Documentation sólo agregará información a los metadatos si se define DEBUG.

[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
    string text;

    public Documentation(string text)
    {
        this.text = text;
    }
}

class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}

Vea también

Conceptos

Guía de programación de C#

Referencia

Reflexión (Guía de programación de C#)

Atributos (Guía de programación de C#)

Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)

Crear atributos personalizados (Guía de programación de C#)

Acceso a atributos mediante reflexión (Guía de programación de C#)

System.Reflection

Attribute