Essa é uma coleção de projetos C# dividida em tópicos que contém exemplos de código com explicações, diferentes usos e links para outras leituras.
É um playground porque você pode fazer alterações no código para ver como ele se comporta,
além de testá-lo usando asserções. Também é possível
revisar o código automaticamente com o dotnet format e verificar se ele
segue o guia de estilo de código C# definido no .editorconfig. Isso tudo pode
tornar seu processo de aprendizagem mais interativo e ajudar a manter a qualidade do código bastante
alta desde o início.
É um cheatsheet porque você pode voltar a esses exemplos de código quando quiser recapitular a sintaxe das estruturas padrão do C#. O código está cheio de asserções, então você poderá ver o retorno dos métodos sem precisar executá-los.
Você pode se interessar também por 🤖 Gravatar Extensions
learn-csharp/
├─ learn-csharp.sln # solução com todos os exemplos (playground/cheatsheet)
├─ README.md
├─ .editorconfig # guia de estilo de código
└─ src/
├─ getting_started/ # variáveis e fundamentos
├─ operators/ # aritméticos, bitwise, atribuição, relacionais, lógicos
├─ data_types/ # byte ... object, string, bool, decimal, ...
├─ control_flow/ # if, switch, laços, try-catch, using, yield, async, goto ...
├─ metodos/ # métodos (funções)
├─ classes/ # classes, objetos, herança
├─ modules/ # namespaces, `using` e pacotes NuGet
├─ exceptions/ # tratamento de exceções
├─ files/ # leitura e escrita de arquivos
├─ additions/ # tópicos extras (tuplas, LINQ, pattern matching ...)
├─ standard_libraries/ # bibliotecas padrão (DateTime, TimeSpan)
├─ classes_e_objetos/ # trilha de POO: classes, objetos, métodos, herança ...
└─ ... (demais tópicos de POO listados no Índice)
Os tópicos de Programação Orientada a Objetos (POO) ficam em projetos separados na pasta
src/, cada um com suas classes de exemplo (Pessoa.cs,Veiculo.cs, ...) e o arquivo de testestest_*.cs. Eles fazem parte da soluçãolearn-csharp.sln.
Cada arquivo de exemplo é estruturado para facilitar a aprendizagem e a experimentação dos tópicos de C#. Aqui está um exemplo de como um arquivo típico está organizado:
// Nome do tópico
// Exemplo: Variáveis (variáveis em C#)
// Link para leituras adicionais
// @see: https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/builtin-types/value-types
// Descrição do Tópico
// Uma explicação mais detalhada sobre o tópico atual, como variáveis em C#.
// Exemplo: Variáveis armazenam dados na memória. Em C#, toda variável possui
// um tipo que define o que ela pode guardar.
// Exemplo de Código
int numero = 42; // declaração de uma variável inteira chamada "numero"
// Explicação do Subtópico
// Cada arquivo contém exemplos e funções de teste que ilustram subtópicos
// (ex.: tipos de variáveis, escopo, conversões).Variáveis armazenam dados na memória. Em C#, toda variável possui um tipo fixo, definido na declaração. Veja abaixo como declarar e manipular variáveis:
// Declaração de um inteiro chamado "idade"
int idade = 25;
// A palavra-chave "var" infere o tipo a partir do valor atribuído
var nome = "Erismar"; // inferido como string
// Imprimindo os valores das variáveis
Console.WriteLine($"{nome} tem {idade} anos."); // Saída: Erismar tem 25 anos.
// Variáveis podem ser atualizadas (o tipo permanece o mesmo)
idade = idade + 1;
Console.WriteLine(idade); // Saída: 26Tipos por valor vs. tipos por referência
- Tipos por valor (
int,double,bool,char,decimal, ...): a variável guarda o próprio valor.- Tipos por referência (
string, classes, ...): a variável guarda uma referência para o objeto na memória.
- Encontrar o tópico que deseja aprender ou recapitular.
- Ler os comentários e/ou a documentação vinculada em cada projeto (como no exemplo acima).
- Analisar os exemplos e asserções para ver exemplos de uso e saída esperada dos métodos.
- Alterar o código ou adicionar novas asserções para ver o que acontece.
- Executar testes e revisar o código para ver se ele funciona e para saber se está escrito corretamente.
| Tópico | Exemplo | Assunto |
|---|---|---|
| Começando | ||
| O que é C# | what_is_csharp.md | História, características e usos da linguagem |
| Sintaxe de C# | csharp_syntax.md | Estrutura básica, controles, métodos, classes |
| Variáveis | test_variables.cs | Declaração, var, escopo, conversões, const |
| Operadores | ||
| Aritméticos | test_arithmetic.cs | + - * / %, precedência, divisão inteira |
| Bitwise | test_bitwise.cs | & | ^ ~ << >> |
| Atribuição | test_assignment.cs | = += -= *= /= %= <<= >>= &= |= ^= ??= |
| Relacionais | test_relation.cs | == != > < >= <=, referência vs conteúdo |
| Lógicos | test_logical.cs | && || ! e curto-circuito |
| Tipos de Dados | ||
| byte | test_byte.cs | inteiro sem sinal de 8 bits (0 a 255) |
| sbyte | test_sbyte.cs | inteiro com sinal de 8 bits (-128 a 127) |
| short | test_short.cs | inteiro com sinal de 16 bits |
| ushort | test_ushort.cs | inteiro sem sinal de 16 bits |
| int | test_numbers-int.cs | inteiro com sinal de 32 bits, estouro |
| uint | test_uint.cs | inteiro sem sinal de 32 bits |
| long | test_long.cs | inteiro com sinal de 64 bits |
| ulong | test_ulong.cs | inteiro sem sinal de 64 bits |
| float | test_numbers-float.cs | ponto flutuante de 32 bits |
| double | test_double.cs | ponto flutuante de 64 bits |
| decimal | test_decimal.cs | alta precisão p/ cálculos financeiros |
| char | test_char.cs | caractere Unicode |
| bool | test_bool.cs | true/false |
| string | test_strings.cs | cadeia imutável de caracteres |
| object | test_object.cs | tipo base de tudo, boxing/unboxing |
| Controles de Fluxo | ||
if |
test_if.cs | decisão com uma condição |
if-else |
test_if_else.cs | decisão com alternativa |
else if |
test_else_if.cs | múltiplas condições em sequência |
foreach |
test_foreach.cs | percorrer coleções |
switch |
test_switch.cs | seleção por casos e switch expressions |
for |
test_for.cs | laço com contador |
while |
test_while.cs | laço com verificação no início |
do-while |
test_do_while.cs | laço que executa ao menos uma vez |
try-catch |
test_try_catch.cs | captura de exceções |
break |
test_break.cs | encerrar o laço |
continue |
test_continue.cs | pular para a próxima iteração |
return |
test_return.cs | devolver valores e encerrar métodos |
using |
test_using.cs | liberar recursos (IDisposable) |
yield |
test_yield.cs | gerar sequências sob demanda |
async/await |
test_async_await.cs | programação assíncrona |
goto |
test_goto.cs | desviar para rótulos |
| Funções | ||
| Métodos | test_metodos.cs | parâmetros, ref/out, sobrecarga, params |
| Classes | ||
| Definição de Classe | test_class_definition.cs | campos, propriedades, construtores |
| Objetos | test_class_objects.cs | instâncias e semântica de referência |
| Instância de Objetos | test_instance_objects.cs | new, inicializadores de objeto |
| Métodos de Objetos | test_method_objects.cs | métodos de instância e encadeamento |
| Variáveis de Classe e Instância | test_class_and_instance_variables.cs | static, const, readonly |
| Herança | test_inheritance.cs | virtual/override, base, is/as |
| Módulos | ||
Módulos (using) |
test_modules.cs | namespaces, importação, aliases |
| Pacotes (NuGet) | test_packages.cs | PackageReference para bibliotecas |
| Erros e Exceções | ||
| Tratando Exceções | test_handle_exceptions.cs | try/catch/finally, exceções personalizadas |
| Arquivos | ||
| Lendo e Escrevendo | test_file_reading.cs | StreamWriter/StreamReader |
| Adicional | ||
| Tópicos Adicionais | test_additions.cs | tuplas, LINQ, pattern matching |
| Bibliotecas Padrão | ||
| Tempo e Datas | test_datetime.cs | DateTime e TimeSpan |
| Programação Orientada a Objetos | ||
| Classes e Objetos | test_classes_e_objetos.cs | classes, instâncias, referências |
| Atributos (Campos) | test_atributo_das_classes.cs | campos e inicializadores de objeto |
| Métodos Simples | test_metodos_simples.cs | métodos que executam ações |
| Métodos com Parâmetros | test_metodos_com_parametros.cs | passagem de parâmetros |
| Parâmetros por Valor e Referência | test_parametros_por_valor_e_por_referencia.cs | ref e cópias |
| Métodos com Retorno | test_metodos_com_retorno.cs | return e valores |
| Sobrecarga de Métodos | test_sobrecarga_de_metodos.cs | mesmos nomes, assinaturas diferentes |
O Termo this |
test_utilizando_o_termo_this.cs | referência ao objeto atual |
| Delegates | test_delegates.cs | referências a métodos |
| Método Construtor | test_metodo_construtor_da_classe.cs | inicialização de objetos |
| Sobrecarga de Construtor | test_sobrecarga_de_construtor.cs | construtores com assinaturas variadas |
| Classes Estáticas | test_classes_estaticas.cs | classes sem instâncias |
| Membros Estáticos | test_membros_estaticos.cs | static em métodos e campos |
| Classes Parciais | test_classes_parciais.cs | classes divididas em arquivos |
| Encapsulamento | test_encapsulamento.cs | proteção do estado |
| Encapsulamento com Propriedades | test_encapsulamento_com_propriedades.cs | propriedades validadas |
| Propriedades (Get/Set) | test_propriedades_da_classe_get_set.cs | getters e setters |
| Propriedades e Encapsulamento | test_propriedades_e_encapsulamento.cs | campos privados e regras |
| Herança | test_heranca.cs | classes derivadas, base |
| Classes Abstratas | test_classes_abstratas.cs | modelos para derivação |
| Classes Sealed | test_classes_sealed.cs | classes que não podem ser herdadas |
| Membros Sealed | test_membros_sealed.cs | membros que não podem ser sobrescritos |
| Modificadores de Acesso | test_modificadores_de_acesso.cs | public, private, protected, internal |
| Polimorfismo | test_polimorfismo.cs | virtual/override, abstract |
| Interfaces | test_interfaces.cs | contratos de implementação |
Instalando o Dotnet
Certifique-se de ter o SDK Dotnet instalado em sua
máquina. Este repositório assume o SDK mais recente e os exemplos do playground/cheatsheet usam
net10.0.
Você pode ver a versão do Dotnet executando:
dotnet --versionNota sobre as versões: todos os exemplos de
src/(soluçãolearn-csharp.sln) usamnet10.0.
Instalando dependências
Na pasta raiz do repositório (onde está a solução learn-csharp.sln), execute:
dotnet restoreO comando dotnet restore baixará todas as dependências listadas nos arquivos .csproj das
soluções, utilizando o NuGet como gerenciador de pacotes.
💡Dica Adicional
Se precisar atualizar as dependências para as versões mais recentes disponíveis, você pode usar o comando:
dotnet restore --forceIsso força uma nova restauração, baixando as versões mais recentes dos pacotes, conforme especificado nas configurações do projeto.
Os exemplos do playground são escritos como testes de unidade usando o framework
xunit (com o Microsoft.NET.Test.Sdk para execução). Cada arquivo test_*.cs
contém métodos marcados com [Fact] que validam o comportamento com asserções.
Para executar todos os testes, execute o seguinte comando na raiz do repositório:
dotnet testPara executar os testes de um tópico (projeto) específico:
dotnet test src/operatorsPara executar um teste específico por nome:
dotnet test --filter "FullyQualifiedName~Operators.TestLogical.CurtoCircuitoDoAnd"Para executar todos os testes de um tópico (namespace) inteiro:
dotnet test --filter "FullyQualifiedName~DataTypes"O repositório traz um .editorconfig com o guia de estilo de código C# adotado.
Você pode revisar a formatação dos arquivos automaticamente com o dotnet format.
Verificar se todo o código está de acordo com o estilo (sem alterar nada):
dotnet format learn-csharp.sln --verify-no-changesAplicar a formatação automaticamente:
dotnet format learn-csharp.slnEsse mesmo comando de verificação roda no pipeline de integração contínua (
.github/workflows/ci.yml), garantindo que contribuições sigam o estilo do projeto.