Muitas vezes no desenvolvimento de aplicações é necessário condicionar o uso de determinadas rotinas a um cenário específico.  Existem sistemas que mudam completamente o comportamento, de forma controlada, dado o contexto de seu uso.  Há muitas formas para se fazer isso. Uma delas é  um recurso bastante interessante chamado de "Atributo condicional". Este artigo abordará seu uso. Inicialmente, veja o exemplo abaixo:

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

No exemplo acima pode-se perceber dois elementos no fonte: #define TRACE_ON e um atribute [Conditional("TRACE_ON")] sob o método Msg. Dada a presença deste attribute a mensagem é exibida.

Existem alguns atributos condicionais padrões. Um exemplo é o Conditional DEBUG. Este identificador serve para ativar o rastreamento de compilações de depuração. Veja o exemplo abaixo:

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

Com este recurso percebe-se que um método marcado como condicional passa por um pré-processamento especificando se sua chamada é incluída ou omitida.