C#

22 fev, 2023

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

Publicidade
  • 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.
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:

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);
O código desse projeto de exemplo também está disponível no GitHub: