O C# 8.0 e 9.0 marcam uma das fases mais evolutivas da linguagem, com recursos voltados à segurança contra null, programação funcional, imutabilidade e concisão. Essas versões pavimentaram o caminho para o estilo moderno de programação em .NET 5/6+.
🧩 O que trouxe o C# 8.0? (2019)
Lançado junto com o .NET Core 3.0, o C# 8.0 trouxe recursos poderosos para:
- Evitar NullReferenceException
- Simplificar expressões
- Trabalhar com dados em fluxo assíncrono
- Melhorar legibilidade com
ranges
eswitch
✅ Principais recursos
Recurso | Descrição |
---|---|
Nullable Reference Types | Ajuda a prevenir erros de null em tempo de compilação |
Switch Expressions | Sintaxe mais limpa e funcional para switch
|
Async Streams |
await foreach para consumir streams assíncronos |
Indices e Ranges | Acesso a coleções com ^1 , 1..3 etc |
Default Interface Methods | Métodos com implementação padrão em interfaces |
Pattern Matching avançado | Novos padrões com is , when , property patterns
|
🔍 Exemplos práticos – C# 8.0
1️⃣ Nullable Reference Types
#nullable enable
string? nome = null; // permitido
Console.WriteLine(nome.Length); // ⚠️ aviso em tempo de compilação
🔐 Torna seu código mais seguro contra null.
2️⃣ Switch Expressions
var resultado = numero switch
{
< 0 => "Negativo",
0 => "Zero",
_ => "Positivo"
};
🧠 Muito útil em DDD, regras de negócio e validações.
3️⃣ Async Streams
async IAsyncEnumerable<int> ObterNumerosAsync()
{
for (int i = 0; i < 5; i++)
{
await Task.Delay(100);
yield return i;
}
}
await foreach (var n in ObterNumerosAsync())
Console.WriteLine(n);
🔄 Ideal para processamento assíncrono em tempo real.
4️⃣ Ranges e índices
int[] numeros = { 10, 20, 30, 40, 50 };
var ultimos = numeros[^2..]; // [40, 50]
✅ Código mais expressivo, estilo Python.
5️⃣ Default Interface Methods
public interface ILogger
{
void Log(string msg) => Console.WriteLine(msg);
}
💡 Abre espaço para interfaces com lógica default sem quebrar herança.
🧬 O que trouxe o C# 9.0? (2020)
Com o .NET 5, o C# 9.0 abraçou de vez conceitos como imutabilidade, simplicidade e expressividade. Essa versão trouxe novos tipos e padrões que facilitam a construção de modelos ricos (DDD), serviços enxutos e estruturas seguras.
✅ Principais recursos
Recurso | Descrição |
---|---|
Record Types | Tipo por valor para modelar dados imutáveis |
Init-only Setters | Permite inicializar propriedades apenas no construtor |
Top-level Statements | Código direto no arquivo, sem Main() explícito |
Pattern Matching avançado | Combinadores and , or , not , relacionais
|
With-expressions | Clonagem de objetos imutáveis com alteração de valores |
Target-typed new | Permite omitir o tipo no new() quando o contexto já indica |
🔍 Exemplos práticos – C# 9.0
1️⃣ Record Types
public record Pessoa(string Nome, int Idade);
var p1 = new Pessoa("Danilo", 30);
var p2 = p1 with { Idade = 31 };
📦 Ideal para DTOs, Events, ViewModels, ValueObjects
2️⃣ Init-only Setters
public class Produto
{
public string Nome { get; init; }
}
🔐 Imutabilidade com facilidade e clareza.
3️⃣ Top-level Statements
using System;
Console.WriteLine("Hello, World!");
✨ Menos boilerplate. Ótimo para demos, scripts, apps pequenos.
4️⃣ Pattern Matching relacional e lógico
string AvaliarIdade(int idade) => idade switch
{
< 12 => "Criança",
>= 12 and < 18 => "Adolescente",
_ => "Adulto"
};
🧠 Expressivo para regras de negócio em DDD e validações.
5️⃣ Target-typed new
Pessoa p = new("João", 42);
🎯 Menos repetição, mais foco.
🔁 Comparativo – C# 8.0 vs C# 9.0
Recurso | C# 8.0 | C# 9.0 |
---|---|---|
Nullable Reference Types | ✅ | ✅ |
Async Streams (await foreach ) |
✅ | ✅ |
Switch Expressions | ✅ | ✅ |
Default Interface Methods | ✅ | ✅ |
Records | ❌ | ✅ |
Init-only Setters | ❌ | ✅ |
With-expressions | ❌ | ✅ |
Top-level Statements | ❌ | ✅ |
Pattern Matching relacional/lógico | Parcial | ✅ |
Target-typed new
|
❌ | ✅ |
🎯 Quando adotar C# 8 ou C# 9?
Use C# 8.0 se:
- Precisa proteger contra
null
- Usa muitos fluxos assíncronos
- Gosta de código mais expressivo com
switch
,ranges
epattern matching
Use C# 9.0 se:
- Aplica DDD, Event Sourcing ou arquitetura baseada em imutabilidade
- Quer trabalhar com dados imutáveis e elegantes (
record
,init
) - Deseja reduzir boilerplate e focar na lógica do domínio
⚙️ Como ativar a versão?
No seu .csproj
:
<LangVersion>9.0</LangVersion>
Ou use:
<LangVersion>latest</LangVersion>
🧠 Conclusão
As versões C# 8.0 e 9.0 modernizaram profundamente o ecossistema .NET.
- C# 8.0 foca em segurança contra erros e performance assíncrona.
- C# 9.0 foca em modelagem funcional e imutável, perfeita para arquitetura limpa.
💡 Se você estiver em projetos modernos com .NET Core 3.1+ ou .NET 5+, migrar para C# 9 é altamente recomendável.
🤝 Conecte-se Comigo
Se você quer aprender mais sobre C#, .NET moderno, arquitetura e boas práticas:
- ✍️ Medium
- 📬 contato@dopme.io