O 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.
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);
Ao executar este exemplo teremos o seguinte resultado:
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