Desenvolvimento - C#

Delegates e eventos no C# 2.0 - Parte 2

Nesta segunda parte neste "passeio" pelos delegates e eventos no C# 2.0, veremos um exemplo prático usando EventArgs em um sistema de conta bancária, onde temos uma simples operação de débito.

por Rodolfo Paoni



Nesta segunda parte neste "passeio" pelos delegates e eventos no C# 2.0, veremos um exemplo prático usando EventArgs em um sistema de conta bancária, onde temos uma simples operação de débito.

public class SaldoNaoDisponivelEventArgs : EventArgs
{
public SaldoNaoDisponivelEventArgs(decimal saldoAtual, decimal valorRequisitado)
{
this._saldoAtual = saldoAtual;
this._valorRequisitado = valorRequisitado;
}

private decimal _saldoAtual;

public decimal SaldoAtual
{
get { return _saldoAtual; }
set { _saldoAtual = value; }
}
private decimal _valorRequisitado;

public decimal ValorRequisitado
{
get { return _valorRequisitado; }
set { _valorRequisitado = value; }
}
}

A nossa intenção é saber exatamente qual o saldo e o valor requisitado na conta quando o saldo for insuficiente para realizar o débito. Customizamos nosso EventArgs criando nossa própria classe e definindo os parâmetros necessários para saber o saldo e o valor que foi solicitado para débito.

public delegate void SaldoNaoDisponivelEventHandler(object sender, SaldoNaoDisponivelEventArgs e);
public event SaldoNaoDisponivelEventHandler SaldoNaodisponivel;

public class Conta
{
private decimal _saldo;

public decimal Saldo
{
get { return _saldo; }
set { _saldo = value; }
}

public Conta(decimal saldo)
{
this._saldo = saldo;
}

public void Debita(decimal valor)
{
if (valor <= Saldo)
{
Saldo -= valor;
}
else
{
SaldoNaodisponivel(this, new SaldoNaoDisponivelEventArgs(Saldo, valor));
}
}
}

Nesta classe criamos um delegate que define como valor de tetorno void e recebe um parâmetro object, que seria a classe que disparou o evento e o nosso EventArgs customizado SaldoNaoDisponivelEventArg. A partir daí, criamos um evento do tipo do delegate chamdo SaldoNaoDisponivelEventHandler. Este evento será disparado na operação de débito, quando o saldo não for suficiente para realizar o débito solicitado.

class Program
{
static void Conta_SaldoNaoDisponivel(object sender, SaldoNaoDisponivelEventArgs e)
{
Console.WriteLine("Saldo atual = {0:C}\nValor requisitado = {1:C}",
e.SaldoAtual,
e.ValorRequisitado);
}

static void Main(string[] args)
{
Conta c = new Conta(1000);
c.SaldoNaodisponivel += new SaldoNaoDisponivelEventHandler(Conta_SaldoNaoDisponivel);

c.Debita(200); // Restam 800
c.Debita(600);// Restam 200
c.Debita(500);// Gera o Evento

Console.ReadKey();
}
}

Nesta classe principal, instanciamos o evento, que é do tipo do delegate e apontamos para o método que tratará o evento de quando o saldo não for disponível. Inicialmente depositamos o valor 1000 e depois vamos retirando valores. Na última linha tentamos debitar 500, mas o saldo é de 200, daí é disparado o evento e como o evento está sendo tratado, ele será apontado para o método "Conta_SaldoNaoDisponivel", onde saberemos exatamente qual o valor que foi requisitado e o saldo quando o valor disponível para débito na conta era insuficiente.

Por hoje é só. Até a próxima!

Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni