Dev (Back & Front)ARTIGO

Novidades do C# 11: Pattern Matching em strings com Span e ReadOnlySpan

C# 11 trouxe melhorias no mecanismo de Pattern Matching voltadas à manipulação de strings através da possibilidade de aplicar padrões de constants.

Novidades do C# 11: Pattern Matching em strings com Span e ReadOnlySpan
Imagem: Renato Groffe

C# 11 também trouxe melhorias no mecanismo de Pattern Matching voltadas à manipulação de strings. Isto acontece através da possibilidade de aplicar padrões com constants associadas a instâncias dos tipos Span<char> e ReadOnlySpan<char>.

Na listagem a seguir temos a implementação da classe estática TestesPatternMatching:

  • O método IsProgrammingLanguage recebe como parâmetro uma instância de ReadOnlySpan<char>, fazendo uso do operador is (linha 7) e de um array que representa parte de uma string (iniciando com o valor C# – linha 9) para testar padrões de texto;
  • Já no método IsRelationalDatabase temos outro exemplo de utilização do operador is (linha 17), a fim de identificar textos que iniciam com o termo SQL.
csharp
namespace ExemploPatternMatchSpan;

public static class TestesPatternMatching
{
    public static void IsProgrammingLanguage(ReadOnlySpan<char> tecnologia)
    {
        if (tecnologia is "C# 11")
            Console.WriteLine($"{tecnologia} = versão mais recente da linguagem");
        else if (tecnologia is ['C', '#', ..])
            Console.WriteLine($"{tecnologia} = linguagem para desenvolvimento em .NET");
        else
            Console.WriteLine($"{tecnologia} = outro tipo de tecnologia");
    }

    public static void IsRelationalDatabase(Span<char> tecnologia)
    {
        if (tecnologia is ['S', 'Q', 'L', ..])
            Console.WriteLine($"{tecnologia} = banco de dados relacional");
        else
            Console.WriteLine($"{tecnologia} = outro tipo de tecnologia");
    }
}

Na próxima listagem temos a declaração de várias strings baseadas em ReadOnlySpan<char> e Span<char>, com os métodos IsProgrammingLanguage e IsRelationalDatabase de TestesPatternMatching sendo acionados a fim de testar esta nova funcionalidade:

csharp
using System.Runtime.InteropServices;
using ExemploPatternMatchSpan;

Console.WriteLine("***** Testes com C# 11 | Generic Attributes *****");
Console.WriteLine($"Versao do .NET em uso: {RuntimeInformation
    .FrameworkDescription} - Ambiente: {Environment.MachineName}- Kernel: {Environment
    .OSVersion.VersionString}");

Console.WriteLine();
Console.WriteLine("**** Testes com ReadOnlySpan<char> ****");
ReadOnlySpan<char> tecnologia01 = "C# 10";
ReadOnlySpan<char> tecnologia02 = "SQL Server 2022";
ReadOnlySpan<char> tecnologia03 = "C# 11";
ReadOnlySpan<char> tecnologia04 = "C# 9";
TestesPatternMatching.IsProgrammingLanguage(tecnologia01);
TestesPatternMatching.IsProgrammingLanguage(tecnologia02);
TestesPatternMatching.IsProgrammingLanguage(tecnologia03);
TestesPatternMatching.IsProgrammingLanguage(tecnologia04);

Console.WriteLine();
Console.WriteLine("**** Testes com Span<char> ****");
Span<char> tecnologia05 = "SQL Server 2000".ToCharArray();
Span<char> tecnologia06 = "C# 8".ToCharArray();
Span<char> tecnologia07 = "SQL Server 2019".ToCharArray();
TestesPatternMatching.IsRelationalDatabase(tecnologia05);
TestesPatternMatching.IsRelationalDatabase(tecnologia06);
TestesPatternMatching.IsRelationalDatabase(tecnologia07);

Ao executar este exemplo teremos o seguinte resultado:

O código desse projeto de exemplo também está disponível no GitHub:

https://github.com/renatogroffe/CSharp11-PatternMatchingSpan

Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!

E finalizo este artigo com um convite…

Neste próximo evento ONLINE e GRATUITO do Canal .NET serão apresentadas as principais novidades que integram o .NET 7, com exemplos de implementação já utilizando o C# 11 e o ASP.NET Core.

Quando: 06/03/2023 (segunda) a partir das 21:00 — horário de Brasília

Faça sua inscrição em:
https://bit.ly/live-dotnet7-novidades

Referências

C# 11 – Guia de Referência: artigos, vídeos e exemplos de utilização

Pattern match Span<char> on a constant string | Microsoft Learn

Renato GroffeAutor

Atua como consultor em atividades voltadas ao desenvolvimento de sistemas há mais de 15 anos. Microsoft MVP (Most Valuable Professional) e participante do programa MTAC (Multi-Plataform Technical Audience Contributor). Bacharel em Sistemas de Informação, com Especialização em Engenharia de Software e MBA em Business Intelligence. Também é palestrante e autor técnico em portais e revistas especializadas, com foco em tecnologias Microsoft e boas práticas na área de software.

Ver perfil