Folha de Consulta C#
Última atualização
Hello World e estrutura do programa
Instruções de nível superior (desde o .NET 6) permitem pular a classe repetitiva.
| Elemento | Código |
|---|---|
| Programa de nível superior | Console.WriteLine("Hello, World!"); |
| Importar um namespace | using System; |
| Ponto de entrada clássico | static void Main(string[] args) { ... } |
| Exibir uma linha | Console.WriteLine("text"); |
| Ler uma linha | string s = Console.ReadLine(); |
| Interpolação de string | Console.WriteLine($"Hi {name}"); |
| Comentários | // line e /* block */ |
Tipos de dados
| Tipo | Descrição |
|---|---|
int | Inteiro com sinal de 32 bits |
long | Inteiro com sinal de 64 bits |
double / float | Números de ponto flutuante |
decimal | Decimal de alta precisão (dinheiro) |
bool | true ou false |
char | Caractere Unicode único |
string | Texto imutável |
var | O compilador infere o tipo |
int? | Tipo de valor anulável |
Variáveis
| Operação | Sintaxe |
|---|---|
| Declarar e inicializar | int x = 5; |
| Inferência de tipo | var name = "Ada"; |
| Constante | const double Pi = 3.14159; |
| Campo somente leitura | readonly int id; |
| Referência anulável | string? maybe = null; |
| Coalescência de nulos | var y = maybe ?? "default"; |
| Condicional de nulos | int? len = text?.Length; |
Controle de fluxo
| Instrução | Sintaxe |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Instrução switch | switch (n) { case 1: ...; break; default: ...; } |
| Expressão switch | var s = n switch { 1 => "one", _ => "other" }; |
| Laço while | while (i < n) { ... } |
| Laço do-while | do { ... } while (i < n); |
| Laço for | for (int i = 0; i < n; i++) { ... } |
| Laço foreach | foreach (var item in list) { ... } |
| Break / continue | break; sai de um laço, continue; pula para a próxima iteração |
Métodos
| Operação | Sintaxe |
|---|---|
| Definir um método | int Add(int a, int b) { return a + b; } |
| Corpo de expressão | int Add(int a, int b) => a + b; |
| Sem valor de retorno | void Greet() { ... } |
| Parâmetro opcional | int Pow(int b, int e = 2) { ... } |
| Argumentos nomeados | Pow(b: 2, e: 3); |
| Parâmetro out | bool TryParse(string s, out int n) { ... } |
| Método estático | static int Square(int x) => x * x; |
| Expressão lambda | Func<int, int> f = x => x * 2; |
Classes e OOP
| Operação | Sintaxe |
|---|---|
| Definir uma classe | class Dog { ... } |
| Propriedade automática | public string Name { get; set; } |
| Propriedade somente leitura | public int Id { get; } |
| Construtor | public Dog(string name) { Name = name; } |
| Criar um objeto | var d = new Dog("Rex"); |
| Herança | class Puppy : Dog { ... } |
| Interface | interface IRunnable { void Run(); } |
| Sobrescrever um método | public override void Speak() { ... } |
| Record (imutável) | record Point(int X, int Y); |
Coleções
Coleções genéricas de System.Collections.Generic.
| Tipo | Uso e exemplo |
|---|---|
List<T> | Array dinâmico: list.Add(1); list.Count; |
Dictionary<K, V> | Chave-valor: dict["a"] = 1; dict.ContainsKey("a"); |
HashSet<T> | Valores únicos: set.Add(5); set.Contains(5); |
Queue<T> | FIFO: q.Enqueue(x); q.Dequeue(); |
Stack<T> | LIFO: s.Push(x); s.Pop(); |
| Array | int[] nums = { 1, 2, 3 }; |
| Inicializador de coleção | var l = new List<int> { 1, 2, 3 }; |
| Iterar um dicionário | foreach (var kv in dict) { kv.Key; kv.Value; } |
LINQ
Consulte coleções de forma fluente; de System.Linq.
| Operação | Sintaxe |
|---|---|
| Filtrar | nums.Where(n => n > 0) |
| Projetar / mapear | nums.Select(n => n * 2) |
| Ordenar | nums.OrderBy(n => n) / OrderByDescending(...) |
| Primeira correspondência | nums.First(n => n > 5) / FirstOrDefault(...) |
| Any / all | nums.Any(n => n < 0) / nums.All(n => n > 0) |
| Contar correspondências | nums.Count(n => n > 0) |
| Agregar | nums.Sum(), nums.Max(), nums.Average() |
| Agrupar por | items.GroupBy(i => i.Category) |
| Materializar | .ToList() / .ToArray() |
Padrões comuns (propriedades, async)
| Padrão | Sintaxe |
|---|---|
| Método async | async Task<int> GetAsync() { ... } |
| Await em uma task | var result = await GetAsync(); |
| Try / catch | try { ... } catch (Exception e) { ... } |
| Finally | finally { ... } sempre executa |
| Using (dispose) | using var file = File.OpenRead(path); |
| Formatação de string | $"Total: {amount:C}" |
| Classe genérica | class Box<T> { public T Value; } |
| Correspondência de padrões | if (obj is Dog d) { d.Bark(); } |
A sintaxe, as coleções e as consultas LINQ de C# que você mais usa, em uma única página. Esta folha de consulta C# é uma referência rápida para escrever C# - os tipos de dados, o controle de fluxo, as classes, as coleções List/Dictionary, o LINQ e os padrões de propriedade e async que definem o código .NET idiomático.
Tudo aqui é C# padrão no .NET e roda com a CLI dotnet. Copie o que precisar ou teste qualquer trecho ao vivo no playground de C# - sem SDK para instalar.
Perguntas frequentes sobre a folha de consulta C#
Esta folha de consulta C# é gratuita?
Qual é a diferença entre tipos de valor e tipos de referência em C#?
int, double, bool, struct, enum) guardam seus dados diretamente e são copiados ao serem atribuídos ou passados a um método - alterar a cópia não afeta o original. Tipos de referência (class, string, arrays, List<T>) guardam uma referência a dados no heap, então duas variáveis podem apontar para o mesmo objeto e uma alteração por uma é visível pela outra. string é um tipo de referência, mas se comporta de forma imutável.O que é LINQ e quando devo usá-lo?
Where, Select e OrderBy que permitem filtrar, transformar e agregar coleções com chamadas legíveis e encadeáveis em vez de laços manuais. Use-o sempre que, de outra forma, escreveria um laço para construir uma lista filtrada ou projetada - é conciso e avaliado de forma preguiçosa até você chamar ToList() ou iterar.