💻 Exemplos: Capítulo 04: Estruturas Repetitivas, Foreach e o Poder do Span
💻 Exemplos: Capítulo 04: Estruturas Repetitivas, Foreach e o Poder do Span
Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis
🎯 Objetivo dos Exemplos
Demonstrar a evolução da iteração e manipulação contígua de memória em C#: loops tradicionais, foreach otimizado e a aplicação da estrutura de alta performance Span<T> / ReadOnlySpan<T> combinada com stackalloc para processamento numérico com alocação zero no Heap gerenciado (Zero-Allocation).
1. Código Fonte Completo (Program.cs)
/**
* @file Program.cs
* @brief Laços iterativos, Span<T>, ReadOnlySpan<T> e stackalloc em C# 12.
*/
using System;
Console.WriteLine("=== CAPÍTULO 04: LAÇOS MODERNOS E SPAN<T> ===");
// 1. Alocação Pura na Stack com stackalloc e Span<T> (Zero Alocação no Heap / GC Zero)
Span<int> bufferSinais = stackalloc int[8];
// Preenchimento sequencial direto na Stack
for (int i = 0; i < bufferSinais.Length; i++)
{
bufferSinais[i] = (i + 1) * 10;
}
Console.WriteLine($"Buffer alocado na Stack com {bufferSinais.Length} inteiros.");
// 2. Fatiamento de Memória Sem Alocar Novo Array (Slice O(1))
Span<int> janelaCentral = bufferSinais.Slice(start: 2, length: 4);
Console.Write("Elementos da Janela Central (Slice 2..5): ");
foreach (int valor in janelaCentral)
{
Console.Write($"{valor} ");
}
Console.WriteLine();
// Modificar a fatia reflete diretamente no buffer original!
janelaCentral[0] = 999;
Console.WriteLine($"Buffer original no indice 2 apos mutacao na fatia: {bufferSinais[2]}");
// 3. Processamento de Strings Sem Alocação com ReadOnlySpan<char>
string linhaLog = "2026-09-28|KERNEL_SECURITY_ALERT|PID_1042";
// Parsing com Spans não instancia novas strings no Heap!
ReadOnlySpan<char> spanTexto = linhaLog.AsSpan();
int primeiraBarra = spanTexto.IndexOf('|');
int segundaBarra = spanTexto.LastIndexOf('|');
ReadOnlySpan<char> timestamp = spanTexto.Slice(0, primeiraBarra);
ReadOnlySpan<char> severidade = spanTexto.Slice(primeiraBarra + 1, segundaBarra - primeiraBarra - 1);
ReadOnlySpan<char> processo = spanTexto.Slice(segundaBarra + 1);
Console.WriteLine("\n--- Parsing Zero-Allocation via ReadOnlySpan<char> ---");
Console.WriteLine($"Timestamp: [{timestamp}]");
Console.WriteLine($"Severidade: [{severidade}]");
Console.WriteLine($"Processo: [{processo}]");
// 4. Somatório e Estatísticas Eficientes
static double CalcularMedia(ReadOnlySpan<int> valores)
{
if (valores.IsEmpty) return 0.0;
long soma = 0;
foreach (int v in valores)
{
soma += v;
}
return (double)soma / valores.Length;
}
Console.WriteLine($"Media calculada das amostras: {CalcularMedia(bufferSinais):F2}");
2. Instruções de Compilação e Execução
dotnet new console -n AppSpans -f net8.0
cd AppSpans
dotnet run
3. Saída Esperada no Terminal
=== CAPÍTULO 04: LAÇOS MODERNOS E SPAN<T> ===
Buffer alocado na Stack com 8 inteiros.
Elementos da Janela Central (Slice 2..5): 30 40 50 60
Buffer original no indice 2 apos mutacao na fatia: 999
--- Parsing Zero-Allocation via ReadOnlySpan<char> ---
Timestamp: [2026-09-28]
Severidade: [KERNEL_SECURITY_ALERT]
Processo: [PID_1042]
Media calculada das amostras: 153.62