Const vs Readonly em C#: o que escolher e qual a diferença?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Const vs Readonly em C#: qual a diferença e quando usar cada um?

\n\n

Todo desenvolvedor C# mais cedo ou mais tarde enfrenta o dilema: declarar um valor como const ou como readonly? À primeira vista, ambas as palavras-chave fazem a mesma coisa — impedem a alteração de uma variável após a inicialização. Mas, aprofundando-se, revela-se um abismo de diferenças que afetam a arquitetura, o desempenho e até a segurança do código.

\n\n

Neste artigo, não vamos apenas listar fatos secos da documentação. Vamos analisar cenários reais, mostrar armadilhas e ajudá-lo a fazer uma escolha consciente. Vamos lá!

\n\n

O que é const em C#?

\n\n

Const é uma constante de tempo de compilação. Seu valor deve ser conhecido no momento da compilação e não pode ser alterado em tempo de execução.

\n\n
    \n
  • Só pode ser de tipos primitivos: int, double, string, bool, enum e null.
  • \n
  • Implicitamente static — pertence ao tipo, não à instância.
  • \n
  • O valor é inserido diretamente no código em tempo de compilação (como uma macro em C++).
  • \n
  • Não pode ser usado com new ou tipos de referência (exceto string).
  • \n
\n\n
public class MathConstants\n{\n    public const double Pi = 3.14159;\n    public const int MaxRetries = 5;\n    public const string AppName = "MyApp";\n    \n    // Erro! Tipos de referência (exceto string) não podem\n    // public const List<int> Numbers = new List<int>();\n}
\n\n

Quando o compilador encontra const, ele literalmente incorpora o valor no código IL. Isso significa que, se você usar uma constante de outro assembly e depois alterar seu valor, os assemblies antigos ainda usarão o valor antigo — até serem recompilados.

\n\n

O que é readonly em C#?

\n\n

Readonly é um campo que só pode ser inicializado no momento da declaração ou no construtor da classe. Depois disso, não pode ser alterado.

\n\n
    \n
  • Pode ser de qualquer tipo: tanto por valor quanto por referência.
  • \n
  • Pode ser estático ou de instância.
  • \n
  • O valor é calculado em tempo de execução (por exemplo, pode usar new ou chamar um método).
  • \n
  • Não é inserido no código — é um campo comum com proteção contra gravação.
  • \n
\n\n
public class Config\n{\n    public readonly DateTime CreatedAt = DateTime.Now;\n    public readonly List<string> Tags;\n    public static readonly Guid InstanceId = Guid.NewGuid();\n    \n    public Config()\n    {\n        Tags = new List<string> { "csharp", "tutorial" };\n        // Erro! Não pode ser alterado após o construtor\n        // Tags = new List<string>();\n    }\n}
\n\n

Uma nuance importante: readonly protege apenas a referência, não o conteúdo do objeto. Se você tiver um readonly List<int>, não poderá atribuir uma nova lista, mas pode adicionar ou remover elementos livremente.

\n\n

Comparação entre const e readonly: tabela de diferenças

\n\n

Para fixar o conteúdo, aqui está uma comparação visual:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Critérioconstreadonly
Tempo de cálculoCompilaçãoExecução (runtime)
Tipos de dadosApenas primitivos + stringQualquer tipo
EstaticidadeImplicitamente staticPode ser static ou instance
MutabilidadeNuncaApenas no construtor
AcessoComo

Blogs

Book Recommendations