Membros de extensão em C# 14: propriedades, operadores e membros estáticos de extensão
C# 14 introduz membros de extensão, permitindo adicionar propriedades, operadores e membros estáticos de extensão a tipos existentes usando a nova palavra-chave extension.
C# 14 chega com .NET 10 e traz a evolução mais pedida para métodos de extensão desde sua introdução em C# 3.0. Agora você pode definir propriedades de extensão, operadores de extensão e membros estáticos de extensão usando a nova palavra-chave extension.
De métodos de extensão a blocos de extensão
Antes, adicionar funcionalidade a um tipo que você não possui significava criar uma classe estática com métodos estáticos e um modificador this. Esse padrão funcionava para métodos, mas deixava propriedades e operadores fora de alcance.
C# 14 introduz blocos de extensão, uma sintaxe dedicada que agrupa membros de extensão relacionados:
public static class StringExtensions
{
extension(string s)
{
public bool IsNullOrEmpty => string.IsNullOrEmpty(s);
public int WordCount => s.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
}
}
O bloco extension(string s) declara que todos os membros dentro estendem string. Agora você pode acessá-los como propriedades:
string title = "Hello World";
Console.WriteLine(title.IsNullOrEmpty); // False
Console.WriteLine(title.WordCount); // 2
Operadores de extensão
Operadores eram antes impossíveis de adicionar a tipos que você não controla. C# 14 muda isso:
public static class PointExtensions
{
extension(Point p)
{
public static Point operator +(Point a, Point b)
=> new Point(a.X + b.X, a.Y + b.Y);
public static Point operator -(Point a, Point b)
=> new Point(a.X - b.X, a.Y - b.Y);
}
}
Agora instâncias de Point podem usar + e - mesmo que o tipo original não os tivesse definido.
Membros estáticos de extensão
Os blocos de extensão também suportam membros estáticos que aparecem como membros estáticos do tipo estendido:
public static class GuidExtensions
{
extension(Guid)
{
public static Guid Empty2 => Guid.Empty;
public static Guid CreateDeterministic(string input)
{
var hash = SHA256.HashData(Encoding.UTF8.GetBytes(input));
return new Guid(hash.AsSpan(0, 16));
}
}
}
Chame como se fosse um membro estático de Guid:
var id = Guid.CreateDeterministic("user@example.com");
O que ainda não é suportado
C# 14 foca em métodos, propriedades e operadores. Campos, eventos, indexadores, tipos aninhados e construtores não são suportados em blocos de extensão. Eles podem chegar em versões futuras do C#.
Quando usar membros de extensão
Propriedades de extensão brilham quando você tem valores calculados que parecem propriedades naturais de um tipo. O exemplo string.WordCount lê melhor do que string.GetWordCount(). Operadores de extensão funcionam bem para tipos matemáticos ou de domínio onde operadores fazem sentido semântico.
O recurso está disponível agora no .NET 10. Atualize seu projeto para <LangVersion>14</LangVersion> ou <LangVersion>latest</LangVersion> para começar a usar blocos de extensão.
Para a documentação completa, consulte Membros de extensão no Microsoft Learn.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.