Introdução: o debate eterno que nunca perde relevância
Imagine a situação: você está escrevendo código em C# e precisa declarar um valor que não deve mudar. O primeiro pensamento — const. O segundo — static readonly. E o terceiro — "Qual é, afinal, a diferença?".
Esta pergunta é uma das mais populares no Stack Overflow. Milhares de desenvolvedores, de iniciantes a seniores, continuam debatendo o que é melhor. E em 2025, com o lançamento de novas versões do .NET e C# 13, essa escolha se tornou ainda mais interessante.
Neste artigo, vamos esclarecer de uma vez por todas quando usar const e quando usar static readonly. Você aprenderá não apenas a teoria, mas também receberá regras claras que poderá aplicar hoje mesmo.
O que está por trás dos modificadores?
const: constante rígida
O modificador const em C# é literalmente um valor "gravado em pedra". Ele deve ser conhecido em tempo de compilação. O compilador substitui o valor da constante diretamente no código onde quer que ela seja usada.
public class MathConstants{ public const double Pi = 3.14159; public const int DaysInWeek = 7; public const string AppName = "MyApp";}Observe: const é sempre implicitamente static. Você não pode escrever static const — o compilador emitirá um erro.
static readonly: imutabilidade flexível
O modificador static readonly é um campo que é inicializado uma vez e nunca mais muda. A principal diferença: o valor pode ser calculado durante a execução do programa.
public class AppSettings{ public static readonly DateTime ReleaseDate = new DateTime(2025, 1, 15); public static readonly Guid InstanceId = Guid.NewGuid(); public static readonly string ConfigPath = GetConfigPath(); private static string GetConfigPath() { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "config.json"); }}Diferenças principais: tabela para comparação rápida
Vamos organizar tudo em uma tabela clara:
| Característica | const | static readonly |
|---|---|---|
| Tempo de inicialização | Compilação | Execução (construtor estático) |
| Tipos permitidos | Apenas primitivos (int, double, string, enum, bool) | Qualquer tipo (incluindo referência) |
| Memória | Valor copiado para cada assembly | Referência única na memória |
| Compatibilidade de versões | Problemas ao atualizar bibliotecas | Seguro |
| Desempenho | Máximo (substituição em tempo de compilação) | Pequeno overhead no primeiro acesso |
Quando escolher const?
Use const quando:
- O valor é absolutamente imutável — constantes matemáticas (π, e), número de dias na semana, constantes físicas.
- O valor precisa estar disponível em tempo de compilação — por exemplo, para atributos, switch/case, parâmetros padrão.
- Você controla todo o código — e tem certeza de que a biblioteca não será atualizada separadamente.
// Ideal para constpublic class Physics{ public const double SpeedOfLight = 299792458; // m/s public const double GravitationalConstant = 6.67430e-11; // m³/(kg·s²)}
// Uso em atributo —