C# Palavras-chave

Palavras-chave são as palavras que o próprio C# usa: if, class, int, return… Esta página lista todas, cada uma com o que faz, um exemplo curto e a aula que ensina. Elas são de dois tipos: as reservadas, que nunca podem ser nome de variável, e as contextuais, que só são especiais em certos lugares do código.

As duas listas foram conferidas no compilador do laboratório (o dotnet 10.0.112, C# 14): cada palavra foi usada como nome de variável (int palavra = 1;), e as reservadas são exatamente as que deram erro.

Atalhos: Reservadas · Tipos · Valores · Decisões e laços · Exceções · Declarar tipos · Modificadores · Métodos e objetos · Operadores-palavra · Avançadas · Contextuais · Quando dá errado · Experimente


As palavras reservadas

São 77, todas em minúsculas. Nenhuma pode ser nome de variável, método ou classe (a não ser com @ na frente, veja Quando dá errado):

abstract  as        base      bool      break     byte      case      catch
char      checked   class     const     continue  decimal   default   delegate
do        double    else      enum      event     explicit  extern    false
finally   fixed     float     for       foreach   goto      if        implicit
in        int       interface internal  is        lock      long      namespace
new       null      object    operator  out       override  params    private
protected public    readonly  ref       return    sbyte     sealed    short
sizeof    stackalloc static   string    struct    switch    this      throw
true      try       typeof    uint      ulong     unchecked unsafe    ushort
using     virtual   void      volatile  while

Como o C# diferencia maiúsculas de minúsculas, Class, INT e If não são palavras-chave. Compilam, mas confundem quem lê: não use.

Tipos

Cada uma é um apelido para um tipo do .NET: int é o mesmo que System.Int32. Os tamanhos e limites estão em Tipos e Limites.

PalavraO que éExemploAula
boolverdadeiro ou falso (System.Boolean)bool aberto = true;char e bool
charum caractere (System.Char)char letra = 'A';char e bool
byte, sbyteinteiro de 8 bits, sem e com sinalbyte idade = 29;Inteiros
short, ushortinteiro de 16 bits, com e sem sinalshort ano = 2026;Inteiros
int, uintinteiro de 32 bits, com e sem sinal (o int é o padrão)int estoque = 40;Inteiros
long, ulonginteiro de 64 bits, com e sem sinallong populacao = 213_000_000;Inteiros
float, doublenúmero com vírgula de 32 e 64 bits (o double é o padrão)double altura = 1.65;float, double e decimal
decimalnúmero com vírgula exato, de 128 bits: para dinheirodecimal preco = 15.90m;float, double e decimal
stringtexto (System.String)string nome = "Ana";Strings
objecto tipo de onde todos os outros descendem (System.Object)object qualquer = 42;A Classe object
void"nada": o método não devolve valorstatic void Saudar() { … }Métodos

Valores

PalavraO que éExemploAula
true, falseos dois valores do boolbool pago = false;char e bool
null"nenhum objeto"; também "sem valor" num int?string? apelido = null;null
defaulto valor padrão de um tipo (0, false, null); também o "senão" do switchint zero = default;switch

Decisões e laços

PalavraO que fazExemploAula
if, elseexecuta um bloco se a condição for verdadeira; senão, o outroif (nota >= 7) { … } else { … }if e else
switch, caseescolhe um caminho pelo valor; também a expressão x switch { … }switch (opcao) { case "1": … break; }switch, Expressões switch
whilerepete enquanto a condição for verdadeirawhile (saldo > 0) { … }while
dorepete, testando no fim (roda pelo menos uma vez)do { … } while (resposta != "s");do while
forrepete com contadorfor (int i = 0; i < 10; i++) { … }for
foreach, inpassa por cada item de uma coleçãoforeach (string item in compras) { … }foreach
breaksai do laço ou do caseif (achou) break;break e continue
continuepula para a próxima volta do laçoif (nota < 0) continue;break e continue
gotopula para um rótulo ou para outro case (goto case 2;). Quase nunca é a melhor ideiagoto case "1";switch
returntermina o método e, se for o caso, devolve o valorreturn a + b;Valor de Retorno

Exceções e estouro

PalavraO que fazExemploAula
try, catchtenta um bloco e trata a exceção, se viertry { … } catch (FormatException) { … }try e catch
finallybloco que roda sempre, com ou sem exceçãofinally { Console.WriteLine("fim"); }finally
throwlança uma exceçãothrow new ArgumentException("vazio");throw
checkedfaz a conta de inteiros lançar OverflowException quando estourachecked(int.MaxValue + x)Inteiros
uncheckeddeixa a conta estourar e "dar a volta" sem erro (é o padrão)unchecked(int.MaxValue + 1)Inteiros

Declarar tipos e organizar

PalavraO que declaraExemploAula
classuma classe (tipo de referência)class Tarefa { … }Classes e Objetos
structuma struct (tipo de valor)struct Ponto { … }Structs
enumuma lista de constantes com nomeenum Dia { Seg, Ter, Qua }Enums
interfaceum contrato: o que uma classe promete terinterface IForma { double Area(); }Interfaces
delegateum tipo que guarda um método; também um método anônimodelegate int Operacao(int a, int b);Delegates
eventum evento, que avisa quem se inscreveupublic event Action? Mudou;Eventos
namespaceum "sobrenome" que agrupa tiposnamespace Lojinha;Namespaces e using
usingno topo: traz um namespace; num bloco: fecha o recurso no fimusing System.Text; · using var f = File.OpenRead(…);Namespaces, using e IDisposable

Modificadores

PalavraO que mudaExemploAula
publicqualquer código pode usarpublic string Nome { get; }public, private e internal
privatesó dentro do próprio tipo (o padrão nos membros)private int _saldo;public, private e internal
protectedo próprio tipo e as classes filhasprotected decimal taxa;Herança
internalsó dentro do mesmo projeto (o padrão nas classes)internal class Ajudante { … }public, private e internal
staticpertence ao tipo, não a cada objetostatic int contador;static
constconstante, decidida na compilaçãoconst int MaxItens = 100;Constantes
readonlycampo que só recebe valor na declaração ou no construtorprivate readonly List<int> _notas = [];readonly e init
abstractclasse que não se instancia; método sem corpo, que a filha tem de escreverabstract class Forma { public abstract double Area(); }Classes Abstratas
virtualmétodo que as filhas podem substituirpublic virtual string Falar() => "…";virtual e override
overridesubstitui o método virtual ou abstract da mãepublic override string ToString() => Nome;virtual e override
sealedclasse que não pode ter filhas; override que não pode ser substituído de novosealed class Senha { … }sealed
new (modificador)esconde, de propósito, um membro de mesmo nome da mãepublic new void Mostrar() { … }Herança
externmétodo escrito fora do C# (numa biblioteca do sistema), usado com [DllImport]static extern int getpid();Atributos
volatilecampo lido e escrito por várias threads sem cachevolatile bool parar;Threads

Métodos, parâmetros e objetos

PalavraO que fazExemploAula
new (operador)cria um objetovar lista = new List<int>();Classes e Objetos
thiso próprio objeto; também o primeiro parâmetro de um método de extensãothis.nome = nome;this
basea classe mãe: chama o construtor ou o método dela: base(nome) · base.ToString()base
refpassa a própria variável, não uma cópiaDobrar(ref x);ref, out e in
outparâmetro que o método preencheint.TryParse(texto, out int n)ref, out e in
in (parâmetro)passa por referência, só para leiturastatic double Medir(in Ponto p)ref, out e in
paramsaceita quantos argumentos vieremstatic int Somar(params int[] n)params
operatordefine o que um operador (+, ==…) faz com o seu tipopublic static Ponto operator +(Ponto a, Ponto b)Sobrecarga de Operadores
implicit, explicitconversão que acontece sozinha, ou só com castpublic static implicit operator decimal(Reais r)Sobrecarga de Operadores
locksó uma thread por vez entra no blocolock (_trava) { saldo += valor; }Sincronização (lock)

Operadores que são palavras

PalavraO que fazExemploAula
istesta o tipo ou um padrãoif (forma is Circulo c) { … }Pattern Matching
asconverte para um tipo de referência, ou dá null se não derCirculo? c = forma as Circulo;Polimorfismo
typeofo objeto Type que descreve um tipotypeof(int).Name → Int32Reflexão
sizeofo tamanho em bytes de um tipo de valorsizeof(int) → 4Tipos e Limites

Avançadas (código inseguro e memória)

PalavraO que fazExemploAula
unsafelibera ponteiros num bloco (precisa de <AllowUnsafeBlocks> no .csproj)unsafe { int* p = &x; }Memória
fixedprende um objeto na memória enquanto um ponteiro aponta para elefixed (char* p = texto) { … }Memória
stackallocreserva um bloco na pilha, em geral para um SpanSpan<int> v = stackalloc int[8];Span<T>

Palavras-chave contextuais

Estas só têm significado especial em certos lugares. Fora deles, são nomes comuns: string var = "ok"; e int record = 14; compilam. Por isso o C# pôde ganhar palavras novas (como record, em 2020, e field, em 2025) sem quebrar programas antigos que já usavam esses nomes. Mesmo assim, evite usá-las como nome: confunde quem lê.

PalavraOnde é especial e o que fazExemploDesdeAula
varna declaração: "o compilador descobre o tipo"var total = 0m;C# 3var
get, setnuma propriedade: o leitor e o gravadorpublic int Idade { get; set; }C# 1Propriedades
valuedentro do set: o valor que está chegandoset => _idade = value;C# 1Propriedades
fielddentro de um get/set: o campo escondido da propriedade, sem precisar declarar umset => field = value.Trim();C# 14Propriedades
initnuma propriedade: só recebe valor na criação do objetopublic string Nome { get; init; }C# 9readonly e init
requirednuma propriedade: quem cria o objeto tem de preencherpublic required string Nome { get; init; }C# 11Inicializadores e required
recorddeclara um record (classe ou struct de dados)record Produto(string Nome, decimal Preco);C# 9Records
withdepois de um record ou struct: cópia com algumas mudançasp with { Preco = 9.90m }C# 9Records
partialtipo ou método dividido em vários arquivospartial class Tela { … }C# 2Classes Parciais
fileantes de um tipo: ele só existe neste arquivofile class Ajudante { … }C# 11public, private e internal
async, awaitmétodo assíncrono; esperar uma Task sem travarstring t = await File.ReadAllTextAsync("a.txt");C# 5async e await
yieldnum iterador: yield return entrega um item; yield break encerrayield return i * i;C# 2Iteradores
nameofo nome de uma variável, propriedade ou tipo, como textonameof(titulo) → "titulo"C# 6throw
whencondição extra num catch ou num casecatch (IOException e) when (e.HResult == 2)C# 6try e catch
and, or, notcombinam padrõesif (nota is >= 0 and <= 10) · if (x is not null)C# 9Pattern Matching
whererestrição de um genérico (e filtro na sintaxe de consulta do LINQ)class Caixa<T> where T : IComparable<T>C# 2Restrições (where)
notnull, unmanagedrestrições de genérico: "não anulável"; "tipo de valor sem referências dentro"where T : notnullC# 8 / C# 7.3Restrições (where)
allowsrestrição que aceita ref struct (como Span<T>) num genéricowhere T : allows ref structC# 13Restrições (where)
from, select, orderby, ascending, descending, group, by, into, join, on, equals, leta sintaxe de consulta do LINQ, parecida com SQLfrom p in estoque where p.Qtd < 5 orderby p.Nome select p.NomeC# 3O que é LINQ
add, removenum evento: o que fazer no += e no -=add { _lista += value; }C# 1Eventos
extensionbloco de membros de extensão para um tipoextension(string s) { public string Gritar() => …; }C# 14Métodos de Extensão
globalglobal using (vale para o projeto todo) e global:: (a raiz dos namespaces)global using System.Text;C# 10 / C# 2Namespaces e using
aliasextern alias: dois pacotes com nomes iguaisextern alias Antiga;C# 2Pacotes NuGet
dynamictipo checado só na hora de rodardynamic x = 5; x = "texto";C# 4Reflexão
nint, nuintinteiro do tamanho de um endereço: 64 bits no laboratório, 32 no editor do guia (nint.Size dá 8 e 4)nint n = 10;C# 9Tipos e Limites
scopedlimita até onde uma referência (ref, Span) pode irstatic void Ler(scoped Span<int> v)C# 11Span<T>
managedconvenção de chamada de um ponteiro de funçãodelegate* managed<int, int> f;C# 9Memória
args não é palavra-chave

Nas instruções de nível superior, args é só o nome do parâmetro que recebe a linha de comando (aula Argumentos da Linha de Comando). O mesmo vale para Main, Console e List: são nomes do .NET, não da linguagem.

Duas contextuais em ação: field C# 14 poupa declarar o campo de uma propriedade que limpa o texto, e extension C# 14 acrescenta um método ao string:

Produto p = new() { Nome = "  caderno  " };
Console.WriteLine($"[{p.Nome}]");
Console.WriteLine("lojinha".Gritar());

class Produto
{
    public string Nome
    {
        get => field;
        set => field = value.Trim();
    } = "";
}

static class Extensoes
{
    extension(string s)
    {
        public string Gritar() => s.ToUpper() + "!";
    }
}
$ dotnet run novos.cs
[caderno]
LOJINHA!

Quando dá errado

CS1001: uma palavra reservada como nome de variável

A Ana calculava a área de um triângulo e chamou a variável de base, como na aula de matemática:

double base = 4;
double altura = 3;
Console.WriteLine($"Área: {base * altura / 2}");
$ dotnet run triangulo.cs
/home/ana/cs/kw/triangulo.cs(1,8): error CS1001: Identificador esperado
/home/ana/cs/kw/triangulo.cs(1,8): error CS1003: Erro de sintaxe, "," esperado

Ocorreu uma falha no build. Corrija os erros de build e execute novamente.

O que significa: "identificador esperado" (em inglês, Identifier expected): depois de double, o compilador esperava um nome, e encontrou base, que é uma palavra da linguagem (a classe mãe, aula base). A segunda mensagem é consequência da primeira. Com outras palavras, a cascata pode ser bem maior: int class = 5; deu 13 erros no laboratório, todos por causa da mesma palavra.

Como consertar: o melhor é trocar o nome: baseTriangulo, lado. Se o nome tem mesmo de ser aquele (por exemplo, um campo de um JSON chamado "class"), ponha @ na frente: @base, @class. O @ diz "isto é um nome, não a palavra-chave", e não faz parte do nome.

int @class = 5;
string var = "contextual";
int record = 14;
Console.WriteLine($"{@class} {var} {record}");
$ dotnet run arroba.cs
5 contextual 14

Experimente

Missão: este é o programa do triângulo, com o erro CS1001. Conserte do jeito que preferir (trocando o nome da variável nas duas linhas, ou com @) para a saída ser Área: 6.

double base = 4;
double altura = 3;
Console.WriteLine($"Área: {base * altura / 2}");
double lado = 4;
double altura = 3;
Console.WriteLine($"Área: {lado * altura / 2}");

Resumo

  • O C# 14 tem 77 palavras reservadas, todas em minúsculas. Nenhuma pode ser nome, a não ser com @ (@class).
  • Usar uma reservada como nome dá CS1001: Identificador esperado, às vezes com uma cascata de outros erros na mesma linha.
  • As contextuais (var, record, async, field…) só são especiais em certos lugares; fora deles, são nomes comuns. É assim que a linguagem ganha palavras novas sem quebrar código antigo.
  • Os tipos (int, string, bool…) são apelidos de tipos do .NET: int = System.Int32.
  • args, Main e Console não são palavras-chave.