💻 Exemplos: Capítulo 09: Classes Modernas, Construtores Primários e Encapsulamento

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


🎯 Objetivo dos Exemplos

Demonstrar o design orientado a objetos contemporâneo em C# 12: utilização de Construtores Primários (Primary Constructors) para classes de negócio, propriedades com acessores imutáveis init, modificador required para validação obrigatória de inicializadores de objeto pelo compilador e encapsulamento com métodos de expressão (Expression-Bodied Members).


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

/**
 * @file Program.cs
 * @brief Classes modernas, Primary Constructors (C# 12) e propriedades init/required.
 */

using System;

Console.WriteLine("=== CAPÍTULO 09: CLASSES MODERNAS E CONSTRUTORES PRIMÁRIOS ===");

// 1. Classe com Construtor Primário (C# 12)
// Parâmetros 'servicoId' e 'porta' ficam acessíveis em todo o corpo da classe!
public class GatewayRede(string servicoId, int porta)
{
    // Validação de invariantes no momento da instanciação
    private readonly string _servicoId = !string.IsNullOrWhiteSpace(servicoId) 
        ? servicoId 
        : throw new ArgumentException("ID do servico nao pode ser vazio.", nameof(servicoId));

    private readonly int _porta = porta > 0 && porta <= 65535 
        ? porta 
        : throw new ArgumentOutOfRangeException(nameof(porta), "Porta TCP invalida.");

    // Propriedades com Acessores Modernos
    public bool Conectado { get; private set; }

    public void AbrirConexao()
    {
        Conectado = true;
        Console.WriteLine($"[Gateway {_servicoId}] Socket TCP vinculado com sucesso na porta {_porta}.");
    }

    public void FecharConexao()
    {
        Conectado = false;
        Console.WriteLine($"[Gateway {_servicoId}] Conexao encerrada.");
    }

    // Expression-bodied member
    public override string ToString() => $"Gateway '{_servicoId}' (Porta: {_porta} | Conectado: {Conectado})";
}

// 2. Classe com Modificador 'required' e 'init' (C# 11/12)
public class ConfiguracaoCluster
{
    public required string ClusterName { get; init; }
    public required int MaxReplicas { get; init; }
    public TimeSpan TimeoutConexao { get; init; } = TimeSpan.FromSeconds(30); // Valor padrão
}

// Execução e Demonstração
GatewayRede gateway = new("SRV_GATEWAY_PROD", 8443);
Console.WriteLine(gateway);

gateway.AbrirConexao();
Console.WriteLine($"Status Atual: {gateway}");
gateway.FecharConexao();

// Instanciação segura com 'required'
var config = new ConfiguracaoCluster
{
    ClusterName = "K8S_ENTERPRISE_EAST",
    MaxReplicas = 16
    // Se omitirmos 'ClusterName', o compilador Roslyn emite erro CS9035!
};

Console.WriteLine($"\nCluster Configurado: {config.ClusterName} (Max Replicas: {config.MaxReplicas})");

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

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

3. Saída Esperada no Terminal

=== CAPÍTULO 09: CLASSES MODERNAS E CONSTRUTORES PRIMÁRIOS ===
Gateway 'SRV_GATEWAY_PROD' (Porta: 8443 | Conectado: False)
[Gateway SRV_GATEWAY_PROD] Socket TCP vinculado com sucesso na porta 8443.
Status Atual: Gateway 'SRV_GATEWAY_PROD' (Porta: 8443 | Conectado: True)
[Gateway SRV_GATEWAY_PROD] Conexao encerrada.

Cluster Configurado: K8S_ENTERPRISE_EAST (Max Replicas: 16)