Existem duas definições diferentes para strings mágicas mas podemos dizer que ambas constituem anti-padrões de projeto. Nas duas definições as strings mágicas fazem o mesmo nebuloso uso de caracteres ou sequências de caracteres como numa outra inadequada prática de programação que inclui "números mágicos" no código-fonte sem sua definição explícita ou fácil entendimento do motivo daquele valor. A diferença delas se dá na forma de utilização das strings mágicas.

A primeira definição, que pode ser encontrada na Wikipédia em inglês com o título de "Magic Strings", trata as strings mágicas como uma constante literal no código fonte que dispara uma funcionalidade escondida (Easter Eggs, por exemplo) ao ser informada pelo usuário. Por exemplo, em um formulário, um usuário digita uma certa string em um campo específico e esta dispara um comportamento inesperado do sistema realmente parecendo ser mágica.

Uma outra definição menos específica não usa estas strings mágicas para nenhuma funcionalidade escondida, mas ainda aponta para a má prática da inserção de strings mal explicadas no código.

Para ficar mais fácil o entendimento, podemos ver este exemplo:

  if (indicaAcao == “D”){
     [...] // faz alguma coisa
  }else{
     if (indicaCobranca == “C”){
        [...] // faz outra coisa
     }
  }

Neste trecho, a variável indicaAcao é testada com os valores “D” e “C”. O que querem dizer estes valores “D” e “C”? Um programador que for dar manutenção neste código poderia ficar confuso: será “D” de “Debitar” e “C” de “Creditar”? Ou será “D” de “Devolver” e “C” de “Cobrar”?

Para a solução deste problema, é recomendável o uso de constantes que traduzem o significado destas strings mágicas. No caso acima, poderíamos fazer algo como:

  public const string Creditar = "C";
  public const string Debitar = "D";

e, nos testes condicionais, usar as constantes no lugar dos caracteres “C” e “D”.