💻 Exemplos: Capítulo 07: Manipulação de Texto: StringBuilder e Regex Source Generators
💻 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