3
respostas

Erro no código de cadastro de cliente

Boa tarde não estou conseguindo Console.WriteLine(Cliente); O que estou fazendo de errado?

using System;

namespace FormasDePagamento { class Program { public static Cliente Cliente { get; private set; }

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        Cliente cliente = new Cliente();
            cliente.Nome = "Rafaela";
            cliente.Pagamento = "Dinheiro";
            cliente.Produto = "Celular";

        Console.WriteLine(Cliente);
    }

}

}


using System; using System.Collections.Generic; using System.Text;

namespace FormasDePagamento { public class Cliente { private string nome; private string pagamento; private string produto;

    public Cliente()
    {
    }

    public Cliente(string nome, string pagamento, string produto)
    {
        this.Nome = nome;
        this.Pagamento = pagamento;
        this.Produto = produto;
    }

    public string Nome { get => nome; set => nome = value; }
    public string Pagamento { get => pagamento; set => pagamento = value; }

    public string Produto { get => produto; set => produto = value; }
}

}

3 respostas

Boa noite Thauana.

Acontece que quando você não atribui nenhum valor a um campo de um objeto quando ele é criado, ele possuirá um valor padrão (default). Como a sua propriedade é do tipo Cliente, que é um tipo de referência, e o compilador cria um campo por baixo dos panos quando você declara uma propriedade, esse campo está sendo inicializado com o valor padrão de tipos de referência, que é null.

Resumindo, falta você atribuir o objeto que você criou à sua propriedade:

// Criar a variável local cliente
Cliente cliente = new Cliente();
            cliente.Nome = "Rafaela";
            cliente.Pagamento = "Dinheiro";
            cliente.Produto = "Celular";
// Atribuir a variável local à propriedade Cliente
Cliente = cliente;
// Exibir na console
Console.WriteLine(Cliente);

Continua com erro, agora este:

System.StackOverflowException: 'Exception_WasThrown'

namespace FormasDePagamento
{
    public class Cliente
    {
        public string Nome { get => Nome; set => Nome = value; }
        public string Pagamento { get => Pagamento; set => Pagamento = value; }

        public string Produto { get => Produto; set => Produto = value; }


    }
}

Boa noite, Thauane.

Do jeito que você implementou as propriedades da classe Cliente, ao atribuir um valor a qualquer propriedade dela, será gerada uma recursão infinita.

De forma mais detalhada, o problema está nos sets das 3 propriedades. Como o compilador transforma uma propriedade em um campo privado, um método get e um método set por debaixo dos panos, o que acontece é o seguinte:

// O código que você implementou:
public string Nome { get => Nome; set => Nome = value; }

// Se transforma em algo parecido com isso:
private string _nome;
public string get_Nome()
{
    return _get_Nome();
}
public void set_Nome(string value)
{
    set_Nome(value);
}

Ou seja, seu get e seu set estão chamando eles mesmos infinitamente, ocasionando um estouro da pilha de chamadas de métodos (Call Stack).

Eu recomendo deixar a classe assim:

public class Cliente
  {
    public string Nome { get; set; }
    public string Pagamento { get; set; }
    public string Produto { get; set; }
  }

Pois ao definir as propriedades dessa forma, você terá o seguinte resultado:

// Esse código:
public string Nome { get; set; }

// Se transforma em algo parecido com isso:
private string _nome;

public string get_Nome()
{
    return _nome;
}

public void set_Nome(string value)
{
    _nome = value;
}
//