C# 8.0 vs C# 9.0 – O que mudou e como usar no seu código moderno
Danilo O. Pinheiro, dopme.io

Danilo O. Pinheiro, dopme.io @daniloopinheiro

About: Inicie em tecnologia por volta de 2017. Neste percurso, com experiencia em desenvolvimento web em .NET e outras tecnologias. Com algumas certificações, e fundador da DevsFree.

Location:
Brasil
Joined:
Jul 22, 2020

C# 8.0 vs C# 9.0 – O que mudou e como usar no seu código moderno

Publish Date: Jul 9
0 0

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 e switch

✅ 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
Enter fullscreen mode Exit fullscreen mode

🔐 Torna seu código mais seguro contra null.


2️⃣ Switch Expressions

var resultado = numero switch
{
    < 0 => "Negativo",
    0 => "Zero",
    _ => "Positivo"
};
Enter fullscreen mode Exit fullscreen mode

🧠 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);
Enter fullscreen mode Exit fullscreen mode

🔄 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]
Enter fullscreen mode Exit fullscreen mode

✅ Código mais expressivo, estilo Python.


5️⃣ Default Interface Methods

public interface ILogger
{
    void Log(string msg) => Console.WriteLine(msg);
}
Enter fullscreen mode Exit fullscreen mode

💡 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 };
Enter fullscreen mode Exit fullscreen mode

📦 Ideal para DTOs, Events, ViewModels, ValueObjects


2️⃣ Init-only Setters

public class Produto
{
    public string Nome { get; init; }
}
Enter fullscreen mode Exit fullscreen mode

🔐 Imutabilidade com facilidade e clareza.


3️⃣ Top-level Statements

using System;

Console.WriteLine("Hello, World!");
Enter fullscreen mode Exit fullscreen mode

✨ 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"
};
Enter fullscreen mode Exit fullscreen mode

🧠 Expressivo para regras de negócio em DDD e validações.


5️⃣ Target-typed new

Pessoa p = new("João", 42);
Enter fullscreen mode Exit fullscreen mode

🎯 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 e pattern 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>
Enter fullscreen mode Exit fullscreen mode

Ou use:

<LangVersion>latest</LangVersion>
Enter fullscreen mode Exit fullscreen mode

🧠 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:

Comments 0 total

    Add comment