Conditional (Guida per programmatori C#)

Aggiornamento: novembre 2007

Rende l'esecuzione di un metodo dipendente da un identificatore di pre-elaborazione. L'attributo Conditional è un alias per ConditionalAttribute e può essere applicato a un metodo o a una classe Attribute.

In questo esempio Conditional viene applicato a un metodo per attivare o disattivare la visualizzazione di informazioni diagnostiche specifiche di un programma:

#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.");
    }
}

Se l'identificatore TRACE_ON non è definito, non verrà visualizzato alcun output di analisi.

L'attributo Conditional viene spesso utilizzato con l'identificatore DEBUG per attivare le funzionalità di analisi e registrazione per le build di debug ma non nelle build di rilascio, come indicato nell'esempio riportato di seguito:

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

Note

Quando viene chiamato un metodo contrassegnato con l'attributo Conditional, la presenza o l'assenza del simbolo di pre-elaborazione specificato determina se la chiamata deve essere inclusa o omessa. Se il simbolo è definito, la chiamata viene inclusa. In caso contrario, viene omessa. L'utilizzo dell'attributo Conditional rappresenta un'alternativa più semplice, più elegante e meno soggetta a errori rispetto all'inclusione dei metodi all'interno di #if e #endif, come indicato nell'esempio riportato di seguito:

#if DEBUG
void ConditionalMethod()
{
}
#endif

Un metodo condizionale deve essere definito in una dichiarazione di classe o di struttura e deve restituire un valore di tipo void.

Utilizzo di più identificatori

Se un metodo ha più attributi Conditional, viene inclusa una chiamata al metodo nel caso in cui almeno uno dei simboli condizionali sia definito (in altre parole, i simboli siano collegati dall'operatore logico OR). In questo esempio la presenza di A o B determinerà una chiamata al metodo:

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

Per ottenere l'effetto di collegare simboli mediante l'operatore logico AND, è possibile definire metodi condizionali seriali. Ad esempio, il secondo metodo riportato più avanti verrà eseguito solo se sono definiti sia A che B:

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

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

Utilizzo di Conditional con le classi Attribute

L'attributo Conditional può essere applicato anche a una definizione di classe Attribute. In questo esempio l'attributo personalizzato Documentation aggiungerà le informazioni ai metadati solo se è definito l'identificatore 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());
    }
}

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Reflection (Guida per programmatori C#)

Attributi (Guida per programmatori C#)

Risolvere le ambiguità sulle destinazioni degli attributi (Guida per programmatori C#)

Creazione di attributi personalizzati (Guida per programmatori C#)

Accesso agli attributi mediante reflection (Guida per programmatori C#)

System.Reflection

Attribute