Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Atribuindo valor default à variável

Boa tarde, estou com uma duvida pertinente, escrevi duas funções que calculam as taxas de um serviço e descontam de montante para saber qual o valor liquido que será retirado. Estou confuso do porque a propriedade Taxas não está recebendo o calculo correto de taxas a serem aplicadas :/

Explicando melhor, na linha de atribuição não ocorre o esperado.

public double CalculoDeTaxas(double ValorSaque)
        {
            Taxas = (ValorSaque * cvariavel) + cfixa;
            return Taxas;
        }

O que acontece depois de executar o código é que a propriedade Taxas armazena somente a variável cfixa e "descarta" a operação anterior.

Fica aqui meu código, gostaria de saber porque está ocorrendo esse problema. Lembrando que o calculo final acontece normalmente descontando o valor exato como é de se esperar.

Program.cs

namespace MinhaCalculadoraDeTaxas
{
    class Program
    {
        static void Main(string[] args)
        {
            CalculaTaxas calculo = new CalculaTaxas();
            calculo.ValorSaque = 400;

            Console.WriteLine("Total de taxas: R$" + calculo.CalculoDeTaxas(calculo.Taxas));
            Console.WriteLine("Valor a ser recebido com a retirada de R$" + calculo.ValorSaque + " é de R$" + calculo.RetiradaBancaria(calculo.ValorSaque));

            Console.ReadLine();
        }
    }
}

CalculaTaxas.cs

namespace MinhaCalculadoraDeTaxas
{
    public class CalculaTaxas
    {
        private double cfixa = 4.99; // Comissao fixa adicionada a cada retirada
        private double cvariavel = 0.0099; // Comissao percentual
        private double liquido;
        public double Taxas { get; set; }


        private double _valorsaque;
        public double ValorSaque
        {
            get
            {
                return _valorsaque;
            }
            set
            {
                if(value < 0)
                {
                    return;
                }
                _valorsaque = value;
            }
        }



        public double CalculoDeTaxas(double ValorSaque)
        {
            Taxas = (ValorSaque * cvariavel) + cfixa;
            return Taxas;
        }

        public double RetiradaBancaria(double ValorSaque)
        {
            CalculoDeTaxas(ValorSaque);
            liquido = ValorSaque - Taxas;
            return liquido;            
        }
    }
}

Obrigado desde já ;)

4 respostas
solução!

Opa, Felipe. Tudo bom?

Pelo que entendi, a classe CalculaTaxas é a responsável pelo calculo das taxas de uma transação de saque.

As operações CalculoDeTaxas e RetiradaBancaria dependem do valor do saque.

Você criou uma propriedade chamada ValorSaque nesta classe, mas, nas operações de calculo e retirada, você não está usando a propriedade da instância, está usando o argumento do método, como na versão simplificada:

public double ValorSaque { get; set; }

public double CalculoDeTaxas(double ValorSaque)
{
    ...
}

public double RetiradaBancaria(double ValorSaque)
{
    ...
}

Nestes métodos, há um conflito no nome ValorSaque. Neste contexto, o compilador resolverá ValorSaque para o valor do argumento e não a propriedade. Para usar a propriedade seria necessário usar o this: this.ValorSaque.

A sua chamada: Console.WriteLine("Total de taxas: R$" + calculo.CalculoDeTaxas(calculo.Taxas)); atribui o valor de calculo.Taxas neste argumento. Até o momento, este valor é 0, porque Taxas nunca recebeu um valor, então a fórmula só vai considerar o cfixa mesmo.

Será que o correto não seria calculo.CalculoDeTaxas(calculo.ValorSaque)? Executando desta forma, tenho a saída Total de taxas: R$8,95.

Mas, se o cálculo de taxas trabalha no saque que já é uma propriedade da classe, talvez o mais correto fosse remover estes argumentos e ficaríamos com o código:

public class CalculaTaxas
{
    private double cfixa = 4.99; // Comissao fixa adicionada a cada retirada
    private double cvariavel = 0.0099; // Comissao percentual
    private double liquido;
    public double Taxas { get; set; }


    private double _valorsaque;
    public double ValorSaque
    {
        get
        {
            return _valorsaque;
        }
        set
        {
            if(value < 0)
            {
                return;
            }
            _valorsaque = value;
        }
    }

    public double CalculoDeTaxas()
    {
        Taxas = (ValorSaque * cvariavel) + cfixa;
        return Taxas;
    }

    public double RetiradaBancaria()
    {
        CalculoDeTaxas();
        liquido = ValorSaque - Taxas;
        return liquido;            
    }
}

O que você acha?

Oi Guilherme,

O código ficou mais limpo mesmo, obrigado :)

Gostaria de perguntar se o código:

Taxas = (ValorSaque * cvariavel) + cfixa;
return Taxas;

Está atribuindo por baixo dos panos o resultado dessa operação em _taxas? E depois disso quando faço o return Taxas; ele busca _taxas?

Exatamente, Felipe :)

Só pra reforçar, o compilador irá criar algo como:

private int _taxas;
public double Taxas
{
    get
    {
        return _taxas;
    }
    set
    {
        _taxas = value;
    }
}

Entendi, muito obrigado Gui ;)