O C# 13, lançado com o .NET 9, introduziu diversos aprimoramentos que tornam o desenvolvimento mais eficiente, seguro e expressivo. Vamos explorar os principais recursos com exemplos de código.
1. Coleções com params
Agora, o modificador params
pode ser aplicado a qualquer tipo que suporte expressões de coleção, como List<T>
, Span<T>
e IEnumerable<T>
. Isso permite passar coleções diretamente para métodos, sem a necessidade de convertê-las para arrays.
Exemplo:
public void ImprimirNumeros(params IEnumerable<int> numeros)
{
foreach (var numero in numeros)
Console.WriteLine(numero);
}
// Uso
ImprimirNumeros(new List<int> { 1, 2, 3 });
ImprimirNumeros(new int[] { 4, 5, 6 });
Essa flexibilidade facilita o trabalho com diferentes tipos de coleções.
2. Novo Tipo Lock
para Sincronização de Threads
O tipo System.Threading.Lock
oferece uma abordagem moderna para sincronização de threads, substituindo o uso do Monitor
. Ele permite um bloqueio mais seguro e eficiente em seções críticas de código.
Exemplo:
var lockObject = new System.Threading.Lock();
using (lockObject.EnterScope())
{
// Seção crítica
Console.WriteLine("Recurso acessado com segurança");
}
Essa abordagem reduz o risco de deadlocks e melhora a clareza do código.
3. Acesso Implícito com Índices Reversos
O operador ^
agora pode ser usado em inicializadores de objetos, permitindo acessar elementos de coleções a partir do final de forma mais intuitiva.
Exemplo:
var contagem = new int[10];
contagem[^1] = 0; // Último elemento
contagem[^2] = 1; // Penúltimo elemento
Isso facilita a manipulação de coleções sem a necessidade de cálculos manuais de índices.
4. Métodos async
com ref
e unsafe
Agora, métodos async
podem declarar variáveis locais ref
e utilizar código unsafe
, desde que respeitem as regras de segurança, como não acessar variáveis ref
após um await
.
Exemplo:
public async Task ProcessarDadosAsync()
{
Span<byte> buffer = stackalloc byte[1024];
// Operações com buffer
await Task.Delay(1000);
}
Isso permite operações de memória de baixo nível de forma segura em métodos assíncronos.
5. Propriedades e Indexadores Parciais
Agora, é possível declarar propriedades e indexadores parciais, permitindo separar a definição e a implementação em diferentes arquivos, facilitando a organização do código.
Exemplo:
public partial class Pessoa
{
public partial string Nome { get; set; }
}
// Em outro arquivo
public partial class Pessoa
{
private string _nome;
public partial string Nome
{
get => _nome;
set => _nome = value;
}
}
Essa abordagem é útil, especialmente quando se trabalha com geradores de código.
6. Expressões with
para Clonagem de Objetos
As expressões with
foram aprimoradas para suportar a clonagem de objetos mais complexos, como arrays e coleções, facilitando a criação de cópias imutáveis com modificações.
Exemplo:
public record Pessoa(string Nome, int Idade, string[] Hobbies);
var pessoa1 = new Pessoa("Alice", 30, new string[] { "Leitura", "Caminhada" });
var pessoa2 = pessoa1 with { Idade = 31 };
Essa funcionalidade melhora a imutabilidade e a segurança do código.
7. Literais de String Brutos
Os literais de string brutos, delimitados por três aspas ("""
), permitem definir strings multilinhas sem a necessidade de escapar caracteres especiais, facilitando a manipulação de textos complexos.
Exemplo:
var json = """
{
"nome": "João",
"idade": 30,
"hobbies": ["Leitura", "Ciclismo"]
}
""";
Isso simplifica a inclusão de conteúdo como JSON ou XML no código.
🤝 Conecte-se Comigo
Estou sempre aberto a trocar ideias e aprender com a comunidade. Se você também está explorando o C# 13 ou outras tecnologias, vamos nos conectar:
Top comments (0)