💻 Exemplos: Capítulo 07: Manipulação de Texto: StringBuilder e Regex Source Generators

Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar as melhores práticas de processamento de texto em .NET: mitigação de alocações excessivas no Heap causadas pela imutabilidade de System.String, composição eficiente de buffers textuais com StringBuilder e compilação em tempo de build de expressões regulares via Regex Source Generators ([GeneratedRegex]) introduzidos no .NET 7/8.


1. Código Fonte Completo (Program.cs)

/**
 * @file Program.cs
 * @brief Manipulação de texto de alto rendimento, StringBuilder e Regex Source Generators em .NET 8.
 */

using System;
using System.Text;
using System.Text.RegularExpressions;

Console.WriteLine("=== CAPÍTULO 07: STRINGS, STRINGBUILDER E REGEX SOURCE GENERATORS ===");

// 1. StringBuilder com Capacidade Inicial Dimensionada
int linhasRelatorio = 4;
StringBuilder sb = new StringBuilder(capacity: 512);

sb.AppendLine("=== RELATÓRIO DE TELEMETRIA DO SISTEMA ===");
for (int i = 1; i <= linhasRelatorio; i++)
{
    // AppendFormat ou interpolação direta com AppendLine (C# 10+)
    sb.AppendLine($"[SENSOR #{i:D3}] Status: OK | Leituras: {i * 1250} amostras");
}

Console.WriteLine(sb.ToString());

// 2. Regex Source Generator (Compile-Time Regex)
// Elimina o parsing de autômatos finitos no runtime e aloca zero memória reflexiva!
string payloadLog = "2026-09-28 [ERROR] Code: 0x5F1A DeviceId: SENSOR-9842 Status: FAILED";

Match correspondencia = AnalisadorLogs.ExtrairMetricas().Match(payloadLog);

if (correspondencia.Success)
{
    Console.WriteLine("--- Metricas Extraidas via Regex Source Generator ---");
    Console.WriteLine($"Nivel:     {correspondencia.Groups["nivel"].Value}");
    Console.WriteLine($"Codigo:    {correspondencia.Groups["codigo"].Value}");
    Console.WriteLine($"Device ID: {correspondencia.Groups["device"].Value}");
}
else
{
    Console.WriteLine("Falha ao analisar a linha de log.");
}

// 3. String.Create com SpanAction (Alocação de String Sob Demanda)
int codigoSessao = 45892;
string idFormatado = string.Create(16, codigoSessao, (span, valor) =>
{
    "SESSION_".AsSpan().CopyTo(span);
    valor.TryFormat(span.Slice(8), out _, "X8");
});

Console.WriteLine($"\nString gerada diretamente no buffer sem alocacao intermediaria: {idFormatado}");

// Declaração parcial necessária para o Source Generator do Roslyn emitir o código
public static partial class AnalisadorLogs
{
    [GeneratedRegex(@"(?<data>\d{4}-\d{2}-\d{2})\s+\[(?<nivel>\w+)\]\s+Code:\s+(?<codigo>0x[0-9A-Fa-f]+)\s+DeviceId:\s+(?<device>[\w-]+)")]
    public static partial Regex ExtrairMetricas();
}

2. Instruções de Compilação e Execução

dotnet new console -n AppStrings -f net8.0
cd AppStrings
dotnet run

3. Saída Esperada no Terminal

=== CAPÍTULO 07: STRINGS, STRINGBUILDER E REGEX SOURCE GENERATORS ===
=== RELATÓRIO DE TELEMETRIA DO SISTEMA ===
[SENSOR #001] Status: OK | Leituras: 1250 amostras
[SENSOR #002] Status: OK | Leituras: 2500 amostras
[SENSOR #003] Status: OK | Leituras: 3750 amostras
[SENSOR #004] Status: OK | Leituras: 5000 amostras

--- Metricas Extraidas via Regex Source Generator ---
Nivel:     ERROR
Codigo:    0x5F1A
Device ID: SENSOR-9842

String gerada diretamente no buffer sem alocacao intermediaria: SESSION_0000B344