Entre 2012 e 2015, o C# deu um salto significativo em clareza de código e produtividade do desenvolvedor. Se o C# 5.0 foi a revolução da programação assíncrona com async/await
, o C# 6.0 trouxe uma série de melhorias de linguagem para tornar o código mais limpo e intuitivo — sem mudar a base do compilador ou exigir novos conceitos complexos.
Neste artigo, você vai entender o que o C# 5.0 não tinha, mas o C# 6.0 passou a oferecer.
📌 Resumo rápido das melhorias do C# 6.0
Recurso | Disponível no C# 6.0 | C# 5.0 tem? |
---|---|---|
Interpolação de strings | ✅ $"Olá, {nome}!"
|
❌ |
Operador null-condicional | ✅ obj?.Propriedade
|
❌ |
nameof() |
✅ nameof(Classe)
|
❌ |
Inicializadores automáticos | ✅ = valor em get; set;
|
❌ |
using static |
✅ using static Math;
|
❌ |
Exceções com catch when
|
✅ catch when (...)
|
❌ |
Expression-bodied members | ✅ => em métodos |
❌ |
💡 Interpolação de strings ($""
)
Uma das mudanças mais queridas do C# 6.0. Substitui o string.Format()
por algo mais legível e seguro.
Antes (C# 5.0):
var msg = string.Format("Olá, {0}!", nome);
Depois (C# 6.0):
var msg = $"Olá, {nome}!";
✅ Mais legível
✅ Menos propenso a erros de posição
💡 Operador null-condicional (?.
)
Evita NullReferenceException
em acessos encadeados.
Antes (C# 5.0):
if (cliente != null && cliente.Endereco != null)
{
Console.WriteLine(cliente.Endereco.Cidade);
}
Depois (C# 6.0):
Console.WriteLine(cliente?.Endereco?.Cidade);
✅ Código mais limpo
✅ Seguro contra null
💡 nameof()
para refatoração segura
Permite referenciar nomes de variáveis, métodos ou propriedades como strings seguras para refatoração.
Antes (C# 5.0):
throw new ArgumentException("nome", "O campo é obrigatório.");
Depois (C# 6.0):
throw new ArgumentException(nameof(nome), "O campo é obrigatório.");
✅ Evita “magic strings”
✅ Refatorável com IntelliSense
💡 Inicializadores automáticos com valor padrão
Permite inicializar uma propriedade diretamente no momento da declaração.
Antes (C# 5.0):
public class Pessoa
{
public string Nome { get; set; }
public Pessoa()
{
Nome = "Desconhecido";
}
}
Depois (C# 6.0):
public class Pessoa
{
public string Nome { get; set; } = "Desconhecido";
}
✅ Menos código boilerplate
✅ Mais legibilidade
💡 Expression-bodied members (=>)
Ideal para métodos curtos, como ToString()
ou propriedades simples.
Antes (C# 5.0):
public override string ToString()
{
return Nome;
}
Depois (C# 6.0):
public override string ToString() => Nome;
✅ Conciso
✅ Expressivo
💡 using static
para reduzir repetição
Permite importar métodos estáticos diretamente, sem precisar repetir o nome da classe.
Antes (C# 5.0):
var seno = Math.Sin(angulo);
var raiz = Math.Sqrt(valor);
Depois (C# 6.0):
using static System.Math;
var seno = Sin(angulo);
var raiz = Sqrt(valor);
✅ Útil em classes utilitárias ou matemáticas
✅ Código mais limpo
💡 catch when
– Filtros de exceção
Permite capturar exceções com uma condição específica.
Antes (C# 5.0):
try
{
//...
}
catch (SqlException ex)
{
if (ex.Number == 1205)
// tratar deadlock
}
Depois (C# 6.0):
catch (SqlException ex) when (ex.Number == 1205)
{
// tratar deadlock
}
✅ Código mais coeso
✅ Mais próximo do try-catch
do F#
🧠 Comparativo final
Funcionalidade | C# 5.0 | C# 6.0 |
---|---|---|
Programação assíncrona (await ) |
✅ | ✅ |
Interpolação de strings ($"" ) |
❌ | ✅ |
Null-safe operator (?. ) |
❌ | ✅ |
nameof() |
❌ | ✅ |
Inicialização direta get; set;
|
❌ | ✅ |
catch when |
❌ | ✅ |
=> para membros simples |
❌ | ✅ |
using static |
❌ | ✅ |
📘 Conclusão
Enquanto o C# 5.0 focou em concorrência assíncrona com async/await
, o C# 6.0 trouxe uma série de refinamentos para melhorar a experiência do desenvolvedor. Ele não mudou conceitos fundamentais, mas elevou o nível de produtividade, clareza e segurança no código.
✅ Se você ainda está usando C# 5.0, vale a pena considerar a migração para versões mais modernas — começando pelo 6.0 — por questões de legibilidade, manutenibilidade e robustez.
🤝 Conecte-se Comigo
Se você está modernizando seu código .NET ou ensinando boas práticas com C#, vamos trocar ideias:
- ✍️ Medium
- 📬 contato@dopme.io