💻 Exemplos: Capítulo 03: Estruturas Condicionais, Switch Expressions e Pattern Matching

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


🎯 Objetivo dos Exemplos

Apresentar o poderoso sistema de Pattern Matching moderno do C# 12: substituição dos longos blocos switch imperativos por Switch Expressions concisas, padrões relacionais (<, >, <=), padrões lógicos (and, or, not) e desestruturação de tipos com Property Patterns.


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

/**
 * @file Program.cs
 * @brief Pattern Matching avançado, Switch Expressions e desestruturação em C# 12.
 */

using System;

Console.WriteLine("=== CAPÍTULO 03: PATTERN MATCHING E SWITCH EXPRESSIONS ===");

// 1. Tipos de Domínio para Telemetria
public record AlertaHardware(string Dispositivo, double TemperaturaCelsius, int NivelBateriaPercentual);

// 2. Classificação de Temperatura via Relational & Logical Patterns
static string ClassificarTemperatura(double temp) => temp switch
{
    < 0.0 => "CONGELAMENTO CRÍTICO",
    >= 0.0 and < 45.0 => "NOMINAL / SEGURO",
    >= 45.0 and < 75.0 => "ALERTA TÉRMICO ELEVADO",
    >= 75.0 and < 100.0 => "CRÍTICO - THROTTLING DE CPU",
    _ => "EMERGÊNCIA - DESLIGAMENTO IMEDIATO"
};

// 3. Avaliação de Risco com Property Pattern
static string AvaliarSaudeDispositivo(AlertaHardware alerta) => alerta switch
{
    { TemperaturaCelsius: >= 80.0, NivelBateriaPercentual: < 15 } =>
        $"[PERIGO EXTREMO] {alerta.Dispositivo}: Superaquecimento com bateria fraca!",

    { TemperaturaCelsius: >= 80.0 } =>
        $"[ALERTA TÉRMICO] {alerta.Dispositivo}: Temperatura perigosa ({alerta.TemperaturaCelsius}°C).",

    { NivelBateriaPercentual: <= 10 } =>
        $"[BATERIA CRÍTICA] {alerta.Dispositivo}: Restam apenas {alerta.NivelBateriaPercentual}%.",

    _ => $"[OPERACIONAL] {alerta.Dispositivo}: Todos os parâmetros dentro da normalidade."
};

// 4. Pattern Matching com Tipos Polimórficos (Type Pattern)
static string DespacharEvento(object evento) => evento switch
{
    int codigo => $"Evento de Codigo Numerico: 0x{codigo:X4}",
    string mensagem => $"Evento de Log: '{mensagem}'",
    AlertaHardware a => $"Evento Estruturado: Dispositivo {a.Dispositivo}",
    null => "Evento Nulo Descartado",
    _ => $"Evento Desconhecido do Tipo {evento.GetType().Name}"
};

// Execução e Testes
var sensores = new[]
{
    new AlertaHardware("Sensor_Nucleo_01", 38.5, 95),
    new AlertaHardware("Sensor_GPU_Cluster", 82.0, 70),
    new AlertaHardware("Sensor_Gateway_IoT", 92.4, 8)
};

Console.WriteLine("\n--- 1. Avaliação de Sensores via Property Pattern ---");
foreach (var s in sensores)
{
    Console.WriteLine(AvaliarSaudeDispositivo(s));
    Console.WriteLine($"   -> Status Termico: {ClassificarTemperatura(s.TemperaturaCelsius)}");
}

Console.WriteLine("\n--- 2. Despacho Polimórfico de Eventos ---");
Console.WriteLine(DespacharEvento(0xA1B2));
Console.WriteLine(DespacharEvento("SUBSYSTEM_INITIALIZED"));
Console.WriteLine(DespacharEvento(sensores[0]));

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

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

3. Saída Esperada no Terminal

=== CAPÍTULO 03: PATTERN MATCHING E SWITCH EXPRESSIONS ===

--- 1. Avaliação de Sensores via Property Pattern ---
[OPERACIONAL] Sensor_Nucleo_01: Todos os parâmetros dentro da normalidade.
   -> Status Termico: NOMINAL / SEGURO
[ALERTA TÉRMICO] Sensor_GPU_Cluster: Temperatura perigosa (82°C).
   -> Status Termico: CRÍTICO - THROTTLING DE CPU
[PERIGO EXTREMO] Sensor_Gateway_IoT: Superaquecimento com bateria fraca!
   -> Status Termico: CRÍTICO - THROTTLING DE CPU

--- 2. Despacho Polimórfico de Eventos ---
Evento de Codigo Numerico: 0xA1B2
Evento de Log: 'SUBSYSTEM_INITIALIZED'
Evento Estruturado: Dispositivo Sensor_Nucleo_01