Recursos Novos no C#11

Neste artigo, exploramos as principais novidades introduzidas no C#11, focando em melhorias de sintaxe e funcionalidades que facilitam o desenvolvimento.

Configuração de um Projeto Console com .NET 7.0

Para começar, crie um novo projeto de console usando o SDK do .NET 7.0. O arquivo de projeto pode ser estruturado da seguinte forma:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <RootNamespace>MeuProjetoConsole</RootNamespace>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

Atributos Genéricos

No C#11, é possível criar atributos genéricos personalizados, o que permite reutilizar a lógica de anotação para diferentes tipos de dados. Por exemplo, defina um atributo genérico assim:

public class AtributoGenerico<T> : Attribute
{
    public T Valor { get; set; }

    public AtributoGenerico()
    {
    }

    public AtributoGenerico(T valorReal) : this()
    {
        Valor = valorReal;
    }
}

Este atributo pode ser aplicado em propriedades de classes, simplificando o uso de múltiplos tipos:

public class Usuario
{
    [AtributoGenerico<int>]
    public int IdUsuario { get; set; }

    [AtributoGenerico<string>("valorPadrao")]
    public string Nome { get; set; }
}

Validação de Nulos

No C#10, a validação de parâmetros nulos era realizada manualmente usando exceções. Por exemplo:

public Usuario ObterUsuario(string nome)
{
    ArgumentNullException.ThrowIfNull(nameof(nome));
    // Restante do código
}

O C#11 planejava introduzir uma sintaxe simplificada com dois operadores de exclamação, mas testes indicam que essa funcionalidade ainda não é suportada, resultando em erros de compilação.

Quebras de Linha em Strings com Interpolação

No C#11, o texto dentro das chaves {} em strings interpoladas pode abranger múltiplas linhas. Isso permite expressões C# complexas, como consultas LINQ ou padrões de correspondência, a serem escritas de forma mais legível.

Correspondência de Padrões em Listas

A correspondência de padrões em listas foi expandida no C#11, permitindo verificar sequências de elementos em arrays ou listas. Padrões como constantes, tipos e operações relacionais podem ser utilizados. Além disso, o padrão de descarte \_ corresponde a qualquer elemento único, e o padrão de intevralo .. correspodne a zero ou mais elementos.

Exemplos de uso:

var numeros = new[] { 1, 2, 3, 4, 5 };
if (numeros is [1, 2, 3, 4, 5] && numeros is [_, _, _, _, 5])
{
    Console.WriteLine("Padrão de lista correspondido");
}

O padrão \[\_, \_, \_, \_, 5\] verifica listas com cinco elementos, sendo o último igual a 5. O padrão de intervalo \[.., 5\] sipmlifica isso:

if (numeros is [.., 5])
{
    Console.WriteLine("Padrão de lista com intervalo correspondido");
}

Isso equivale a verificar se a lista tem pelo menos um elemento e o último é 5. Em expressões switch, a correspondência de padrões pode ser usada assim:

var amostra1 = new[] { 1, 2, 3, 4, 5 };
var amostra2 = new[] { 1, 3, 5 };
var amostra3 = new[] { 1 };
var amostra4 = new[] { 9 };
var amostra5 = new[] { 1, 6 };

string TestarPadrao(int[] colecao) => colecao switch
{
    [1, 2, 3, 4, 5] => "primeiro",
    [1, 3, .., 5] => "segundo",
    [1, _] => "terceiro",
    [1, ..] => "quarto",
    [..] => "quinto"
};

Console.WriteLine(TestarPadrao(amostra1)); // Saída: primeiro
Console.WriteLine(TestarPadrao(amostra2)); // Saída: segundo
Console.WriteLine(TestarPadrao(amostra3)); // Saída: quarto
Console.WriteLine(TestarPadrao(amostra4)); // Saída: quinto
Console.WriteLine(TestarPadrao(amostra5)); // Saída: terceiro

Strings Literais Brutas

As strings literais brutas são um novo formato no C#11 que permitem incluir texto arbitrário, incluindo espaços, quebras de linha e aspas, sem necessidade de caracteres de escape. Elas começam e terminam com pelo menos três aspas duplas """. Por exemplo:

var mensagem = """
    Esta é uma string literal bruta.
    Pode conter múltiplas linhas e "aspas" sem escape.
    """;

Isso facilita a escrita de strings complexas, como queries SQL ou JSON, diretamente no código.

Tags: C# .NET generics attributes null-checking

Publicado em 6-1 18:11 por Thomas