2
respostas

[Dúvida] Esta dando um erro de stackOverflow!

Até pude ver que estava dando um erro pelo sobrecarregamento da pilha no caso a memória
porem eu pude ver algumas soluuções que continua dando erro segundo informações pode ser um loop infinito que o meu get esta chamando o set recursivamente porem não consegui resolver ainda quem poder me ajudar fico grato!

CLASSE CARRO

class Carro
{
    public string Fabricante => "Ford";
    public string Modelo => "Ford";
    public int Ano 
    {  
       get => Ano;
        set {  
            if (value >= 1960 || value <= 2023)
            {
                Console.WriteLine("Dentro da tabela de ano!");
            }
            else { Ano = value;  Console.WriteLine("O carro está fora do ano ou acima do ano!"); }    
            }
    }
    // o value e do ano

    public int QuantidadePortas => 4;
    public int Velocidade {  get; set; }
    public string DescricaoDetalhada 
    {
        get { return $"""
        Fabricante: {Fabricante}
        Modelo do carro: {Modelo}
        Ano do carro: {Ano}
        Quantidade de portas: {QuantidadePortas}
        """; } 
    }

    public void exibirInformacoes()
    {
        Console.WriteLine($"Informações do carro: {this.Fabricante} {this.Modelo}, {this.QuantidadePortas} portas, {this.Ano}");
    }

    public void acelerar()
    {
        Console.WriteLine("Acelerando...");
        if (Velocidade < 100)
        {
            Velocidade = Velocidade + 5;
        }
    }

    public void frear()
    {
        Console.WriteLine("Freando...");
        if (Velocidade > 0)
        {
            Velocidade = Velocidade - 5;
        }
    }

    public void buzinar()
    {
        Console.WriteLine("Bi Bi");
    }

}

PROGRAM,CS

Carro carro1 = new Carro();
carro1.Ano = 1959;

carro1.acelerar();
carro1.frear();
carro1.buzinar();

Console.WriteLine(carro1.DescricaoDetalhada);
2 respostas

Dá uma olhada nessa parte:

public int Ano 
{  
   get => Ano;
   set {
       if (value >= 1960 || value <= 2023)
       {
           Console.WriteLine("Dentro da tabela de ano!");
       }
       else {
           Ano = value;
           Console.WriteLine("O carro está fora do ano ou acima do ano!");
       }
   }
}

O problema aqui é que tanto o get => Ano quanto o Ano = value dentro do set estão chamando a própria property Ano. Isso faz com que o código entre num ciclo infinito, porque toda vez que tenta acessar ou alterar Ano, ele se autochama de novo — e nunca para.

A solução é simples: usar um campo privado (também conhecido como backing field) pra armazenar o valor real. A property Ano vai apenas acessar e modificar esse campo, assim:

private int _ano;

public int Ano
{
    get => _ano;
    set
    {
        if (value >= 1960 && value <= 2023)
        {
            _ano = value;
            Console.WriteLine("Dentro da tabela de ano!");
        }
        else
        {
            Console.WriteLine("O carro está fora do ano ou acima do ano!");
        }
    }
}

Com isso, o código para de se chamar em loop e passa a funcionar corretamente.

Muito Obrigado Mestre!