💻 Exemplos: Capítulo 09: Classes Modernas, Construtores Primários e Encapsulamento
💻 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)