Const vs Readonly em C#: qual a diferença e quando usar cada um?
\n\nTodo 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.
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\nO que é const em C#?
\n\nConst é 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,enumenull. \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
newou tipos de referência (excetostring). \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\nQuando 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.
O que é readonly em C#?
\n\nReadonly é 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
newou chamar um método). \n - Não é inserido no código — é um campo comum com proteção contra gravação. \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\nUma 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.
Comparação entre const e readonly: tabela de diferenças
\n\nPara fixar o conteúdo, aqui está uma comparação visual:
\n\n| Critério | \nconst | \nreadonly | \n
|---|---|---|
| Tempo de cálculo | \nCompilação | \nExecução (runtime) | \n
| Tipos de dados | \nApenas primitivos + string | \nQualquer tipo | \n
| Estaticidade | \nImplicitamente static | \nPode ser static ou instance | \n
| Mutabilidade | \nNunca | \nApenas no construtor | \n
| Acesso | \nComo
BlogsBook RecommendationsLeia também
Gráficos em Python: visualização de dados com Matplotlib
Princípios SOLID em TypeScript: teoria e prática com exemplos
Como escrever uma API REST em JavaScript em 30 minutos
|