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)