Médio C#
Propriedade com validação no set
Enunciado
Crie uma classe ContaBancaria com uma propriedade Saldo do tipo decimal. O set deve impedir valores negativos, lançando ArgumentException. No Main, tente definir um saldo negativo e capture a exceção, exibindo uma mensagem.
Requisitos
- A propriedade
Saldodeve tergetesetcom validação. - O
setdeve lançarArgumentExceptionse o valor for negativo. - O
Maindeve capturar a exceção e exibir a mensagem.
Código inicial
using System;
public class ContaBancaria
{
// TODO: implementar propriedade Saldo com validação
}
public class Program
{
public static void Main()
{
// TODO: testar saldo negativo e capturar exceção
}
}
Saída esperada
Erro: Saldo não pode ser negativo
Ver dica
Use um campo privado _saldo e no set verifique if (value < 0) throw new ArgumentException(...).
Mostrar solução
using System;
public class ContaBancaria
{
private decimal _saldo;
public decimal Saldo
{
get => _saldo;
set
{
if (value < 0)
throw new ArgumentException("Saldo não pode ser negativo");
_saldo = value;
}
}
}
public class Program
{
public static void Main()
{
var conta = new ContaBancaria();
try
{
conta.Saldo = -100m; // lança exceção
}
catch (ArgumentException ex)
{
Console.WriteLine($"Erro: {ex.Message}");
}
}
}
Passo a passo
- Declaramos um campo privado
_saldopara armazenar o valor real. - Criamos a propriedade
Saldocomgeteset. Ogetretorna_saldo; osetvalida o valor. - No
set, usamosvalue(palavra-chave implícita) para verificar se é negativo. Se for, lançamosArgumentExceptioncom uma mensagem. - Se não for negativo, atribuímos
valuea_saldo. - No
Main, criamos uma conta e tentamos definirSaldo = -100mdentro de um blocotry. - O
catchcaptura a exceção e exibe a mensagem.
Por que funciona
A propriedade encapsula o campo _saldo e impõe uma regra de negócio: saldo não pode ser negativo. Isso é possível porque o set é um bloco de código executado a cada atribuição, permitindo validações e efeitos colaterais.
Erros comuns
- Esquecer de usar
value: escreverif (_saldo < 0)em vez deif (value < 0)valida o valor antigo, não o novo. - Não lançar exceção: apenas ignorar o valor negativo faz o programa continuar com estado inválido.
- Capturar exceção genérica: capturar
Exceptionem vez deArgumentExceptionpode mascarar outros erros.
Outra forma de resolver
Use uma propriedade auto-implementada com validação no construtor:
public decimal Saldo { get; private set; }
public ContaBancaria(decimal saldoInicial) {
if (saldoInicial < 0) throw new ArgumentException(...);
Saldo = saldoInicial;
}
Preferível quando o saldo só muda via métodos da classe.
Saída esperada
Erro: Saldo não pode ser negativo