C# - Usar readonly ou const ?


 Neste artigo vou apresentar as duas formas usadas para definir constantes e suas características e quando usá-las no seu código.

A linguagem C# possui duas versões diferentes de constantes :

  1. Constantes de tempo de compilação (compile-time constants) -  são declaradas usando a palavra-chave const;
  2. Constantes de tempo de execução (runtime constants) - são declaradas usando a palavra-chave readonly;

Elas possuem diferentes comportamentos e usar a forma incorreta pode lhe causar problema.

Como regra geral, e, na maioria dos casos, você deve preferir constantes em tempo de execução(readonly) a constantes em tempo de compilação(const).

As constantes de tempo de compilação(const) são um pouco mais rápidas que as constantes de runtime(readonly) mas são menos flexíveis.

Assim, deixe para usar as constantes de tempo de compilação (const) para ocasiões quando o desempenho for crítico e o valor da constante nunca for alterado entre as liberações das versões do programa.

Sintaxe usada a nível de escopo de classe ou struct :

        
        public const int Milenio = 2000;
     private const double PI = 3.1415;
     const double gravidade = 9.8;

 

        public static readonly int Ano = 2017;
     private readonly int mes;
     readonly double Juros = 6.45;
   constante de tempo de compilação(compile-time) : const       constante de tempo de execução (runtime) :  readonly
 
  • Tem que ser inicializada na sua declaração
  • Pode ser declarada no interior de métodos
  • const é estático e é resolvido em tempo de compilação
  • Se mudar o valor atribuido tem que compilar novamente
 
  • Não precisa ser inicializada na sua declaração
  • Não pode ser declarada no interior de métodos
  • readonly pode ser aplicada para campos estáticos ou de instância
  • Sua inicialização ocorre em tempo de execução

As diferenças no comportamento das constantes de tempo de compilação(const) e as constantes de tempo de execução(readonly) seguem a forma como elas são acessadas. Uma constante de tempo de compilação(const) é substituída pelo valor dessa constante no código do seu objeto.

Dessa forma o código if ( data == Milenio ) vai compilar para o mesmo código da linguagem intermediária (IL) que o código if (data == 2000).

As constantes de tempo de execução são avaliadas em tempo de execução. O IL gerado quando você referencia uma constante somente leitura faz referência à variável readonly, não ao seu valor.

As constantes de tempo de compilação(const) são limitadas a números, strings e nulos. Os valores somente leitura são também constantes na medida em que não podem ser modificadas após o construtor ter sido executado. Mas valores somente leitura são diferentes na medida em que são atribuídos em tempo de execução. Você tem muito mais flexibilidade quando esta trabalhando com constantes de tempo de execução.

Por um lado, as constantes de tempo de execução(readonly) podem ser de qualquer tipo e você pode inicializá-los em um construtor, ou você pode usar um inicializador. Assim você pode criar valores somente leitura das estruturas DateTime enquanto que você não pode criar valores DateTime usando const.

Você pode usar valores readonly para constantes de instâncias, armazenando valores diferentes para cada instância de um tipo da classe. As constantes de tempo de compilação são, por definição, constantes estáticas.

Então para não complicar demais o assunto quando for usar uma constante siga essas duas regras gerais :

E estamos conversados...

"Disse-lhe Jesus: Eu sou o caminho, e a verdade e a vida; ninguém vem ao Pai, senão por mim"
João 14:6

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti