C# - Compreendendo as palavras chave const , readonly e static


 Neste artigo veremos a utilização das palavras chaves const, readonly e static; como elas funcionam, o comportamento de cada uma e as suas diferenças.

Se você já programou ou se deparou com algum trecho de código na linguagem C# é quase certo que já viu uma das seguintes palavras chave : const, readonly e static.

Mas você sabe como elas atuam ?

Sabe dizer qual a diferença entre elas ?

Se respondeu , "Não" , então acompanhe o artigo para saber.

Vamos começar definindo cada uma delas.

1- const

Você usa a palavra-chave const para declarar um campo constante ou uma constante local.

Campos constantes e locais não são variáveis​e não podem ser modificados. As constantes podem ser números, valores booleanos, strings, ou uma referência nula.

Você não deve criar uma constante para representar as informações que você espera mudar a qualquer momento. Por exemplo, não utilize um campo constante para armazenar o preço de um produto, um número de versão do produto, ou o nome de uma pessoa.

Esses valores podem mudar ao longo do tempo, e como os compiladores propagam as constantes, outro código compilado com as bibliotecas terão que ser recompilados para ver as alterações.

   const int x = 0;
   public const double contanteGravitaconal = 6.673e-11;
   private const string nomeProduto = "Visual C#";
   private DateTime dataNascimento = DateTime.Now;
   private const string site = "http://www.macoratti.net";

   //declarando várias constantes em uma linha
   public const double x = 1.0, y = 2.0, z = 3.0;

   //declarando uma expressão Constante
   public const int c1 = 5;
   public const int c2 = c1 + 100;

 

 

 

 

 

 

 

 

 

As constantes declaradas devem ser inicializadas na declaração do campo de outra forma irá ocorre um erro. Por isso o código abaixo não irá compilar visto que o parâmetro j não esta inicializado:

Além disso você não pode declarar uma constante como static e o escopo de um campo declarado com const é local.

2- readonly

A palavra-chave readonly é um modificador que você pode usar em campos.

Quando uma declaração de campo inclui um modificador readonly, as atribuições para os campos introduzidos pela declaração só podem ocorrer como parte da declaração ou em um construtor da mesma classe.

Neste exemplo, o valor do campo _ano não pode ser alterado no método AlterarAno, mesmo que seja atribuído um valor no construtor da classe:

Dessa forma um campo readonly pode ser inicializado tanto na declaração com em um construtor. Portanto, campos somente leitura podem ter diferentes valores, dependendo do construtor utilizado. Assim campos definidos como readonly podem ser usados para constantes em tempo de execução.

Ex:  public static readonly uint valor = (uint)DateTime.Now.Ticks;

Note que podemos declarar um campo readonly como sendo static.

Podemos então alterar o valor de um campo declarado como readonly em tempo de execução ou pela atribuição de um valor em tempo de execução.

Por tudo isso uma campo readonly é chamado de constante em tempo de execução, e o código abaixo irá compilar e executar:

class SomenteLeitura
 {
        readonly int i;
        public SomenteLeitura()
        {
            i = 11;
            Console.WriteLine(i);
        }
 }  

O escopo de um campo declarado como readonly é global.

3- static

Use o modificador static para declarar um membro estático, que pertence ao próprio tipo e não a um objeto específico.

O modificador static pode ser usado com classes, campos, métodos, propriedades, operadores, eventos e construtores, mas não pode ser usado com indexadores, destruidores, ou outros tipos de classes.

Se você declarar uma classe como static então todos os seus membros também devem ser estáticos. Se tentar declarar um método como não sendo estático vai obter o erro conforme mostra a figura abaixo:

Um membro estático não pode ser referenciado através de uma instância mas somente através do nome do tipo.

Abaixo temos a classe Macoratti e a declaração da variável estática numero. Para acessar o valor de número declaramos o nome do tipo Macoratti.numero:

 public class Macoratti
 {
        public static int numero = 100;    
        public void Teste()
        {
        }
 }
 static void Main(string[] args)
 {
            int valor = Macoratti.numero;
}

 

Enquanto uma instância de uma classe contém uma cópia separada de todos os campos de instância da classe, existe apenas uma cópia de cada campo estático.

Não é possível usar esse recurso para referenciar métodos estáticos ou assessores da propriedade.

As Classes e Classes estáticas podem ter construtores estáticos. Construtores estáticos são chamados em algum momento entre o início do programa e quando a classe for instanciada.

Agora deu para receber quais as diferenças entre esses modificadores ?

Vejamos então um resumo final:

const readonly static
  • Constante em tempo de compilação
  • Não pode ser declarada static
  • Não pode ser modificada ou alterada
  • Escopo local
  • Precisa ser inicializada na declaração
  • Constante em tempo de execução
  • Pode ser estática
  • Escopo Global
  • Pode ser declarada no construtor da classe
  • Não pode ser usada com indexadores
  • Pode ser usada em construtores
  • Por padrão é privada
  • Pode ser publica ou parametrizada
  • Se aplicada a uma classe todos os membros tem que ser estáticos também
  • Não pode ser acessado por uma instância

Agora creio que não há dúvidas sobre como esses modificadores atuam.

Até breve.

João 3:17 Porque Deus enviou o seu Filho ao mundo, não para que julgasse o mundo, mas para que o mundo fosse salvo por ele.

João 3:18 Quem crê nele não é julgado; mas quem não crê, já está julgado; porquanto não crê no nome do unigênito Filho de Deus.

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti