2
respostas

[Dúvida] Exercicio 2 Carro

Aqui o código funciona, apesar melhorar um pouco o visual mas tenho duvidas em duas partes em negrito do codigo, pois peguei o codigo da resposta e tentei adaptar

Program.cs

Carro carro1 = new Carro();

    Console.WriteLine("Nome do carro");
    carro1.Modelo = Console.ReadLine()!;
    Console.WriteLine("digite um Fabricante");
    carro1.Fabricante = Console.ReadLine()!;
    Console.WriteLine("digite um ano");
    string anoDoVeiculo = Console.ReadLine()!;
    carro1.Ano = int.Parse(anoDoVeiculo);
    Console.WriteLine("digite um numero");
    string numero = Console.ReadLine()!;
    int numeroEscolhido = int.Parse(numero);
    
if (numeroEscolhido >= 1)
{
    Console.WriteLine("acelera");
    
    carro1.Acelerar();
        
} 
//carro1.DescricaoDetalhada();
Console.WriteLine(carro1.DescricaoDetalhada);
Console.WriteLine(carro1.DescricãoDetalhada);

Carro.cs

///<summary>
///Reescrever os atributos da classe Carro, de modo que eles sejam properties,
///e adicionar uma nova propertie DescricaoDetalhada,
//que mostra o fabricante, modelo e ano do carro.
///</summary>
class Carro
{
    public bool LigaroCarro { get; set; }
    public int Acelerador { get; set; }
    public string Buzinar { get; set; }
    public string Fabricante { get; set; }
    public string Modelo { get; set; }
    private int ano { get; set; }

    ////Reescrever a propriedade Ano da classe carro,
    /// para que ela apenas aceite valores entre 1960 e 2023.

    **public int Ano {
        get => ano; 
        set 
        {
            if(value < 1960 || value > 2023){
                Console.WriteLine("Valor inválido, insira um ano entre 1960 e 2023");
            } else {
                ano = value;
            }
        }
    }**
    public int QuantidadePortas{get; set;}
    //public string DescricaoDetalhada => $"Modelo do carro: {this.Fabricante} {this.Modelo} {this.Ano}";


    /// 
   ** public string DescricãoDetalhada => $"Modelo do carro: {this.Fabricante} {this.Modelo} {this.Ano}";
    public string DescricaoDetalhada => ($"O carro {Modelo} fabricada pela {Fabricante} no ano {Ano}");**
    public void Acelerar()
    {
        LigaroCarro = true;
        if (LigaroCarro)
        {
            Console.WriteLine("Motor Ligado");
            Acelerador = 1;
        }
        else
        {
            Console.WriteLine("Motor Desligado");
        }
    }
    void Frear()
    {
        Acelerador -= 1;
    }
    void Buzina()
    {
        Buzinar = "Fom!!";
    }

}
A parte 
# Public int Ano {(..)
 Confesso não entendi bem a lógica usada.

A segunda parte
#    public string DescricãoDetalhada => $"Modelo do carro: {this.Fabricante} {this.Modelo} {this.Ano}";
#    public string DescricaoDetalhada => ($"O carro {Modelo} fabricada pela {Fabricante} no ano {Ano}");

Aqui os dois casos funcionaram, queria saber a diferença de uso e se há alguma indicação

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

Oii, Ivan.

Vou dividir sua dúvida em duas partes pra deixar melhor:

1. A propriedade Ano:

public int Ano {
    get => ano; 
    set 
    {
        if(value < 1960 || value > 2023){
            Console.WriteLine("Valor inválido, insira um ano entre 1960 e 2023");
        } else {
            ano = value;
        }
    }
}

O que está acontecendo aqui:

Essa estrutura é uma propriedade com lógica personalizada.
No C#, uma property é uma forma de controlar o acesso a um campo (variável interna da classe).
Ela combina getters e setters, métodos especiais para ler e modificar valores de forma segura.

  • get => ano;
    É o getter. Ele retorna o valor atual do campo privado ano.

  • set { ... }
    É o setter. Ele é executado sempre que alguém tenta atribuir um valor à propriedade Ano.

A lógica de validação:

O set está verificando se o valor informado é válido:

if(value < 1960 || value > 2023){
    Console.WriteLine("Valor inválido...");
} else {
    ano = value;
}

Então...

  • Se o valor estiver fora do intervalo permitido, o programa apenas exibe uma mensagem e não altera o campo interno ano.
  • Se for um valor válido, ele é armazenado normalmente.

Por que isso é útil?
Porque protege o objeto contra valores incorretos.
Mesmo que alguém tente fazer carro1.Ano = 1800, o código impede essa atribuição inválida.

2. As propriedades DescricaoDetalhada e DescricãoDetalhada:

public string DescricãoDetalhada => $"Modelo do carro: {this.Fabricante} {this.Modelo} {this.Ano}";
public string DescricaoDetalhada => ($"O carro {Modelo} fabricada pela {Fabricante} no ano {Ano}");

Diferenças práticas:

Essas duas propriedades fazem a mesma coisa em termos de funcionamento:
são expressões de leitura (read-only properties) que retornam uma string formatada.

A diferença está em dois aspectos:

  1. Texto retornado

    • A primeira retorna:
      "Modelo do carro: [Fabricante] [Modelo] [Ano]"
    • A segunda retorna:
      "O carro [Modelo] fabricada pela [Fabricante] no ano [Ano]"

    Ou seja, apenas o texto exibido ao usuário é diferente.

  2. Nome das propriedades

    • Uma delas tem o nome com acentuação (DescricãoDetalhada), o que não é recomendado em C#.

    • Em código, o ideal é evitar acentos e usar nomes consistentes, por exemplo:

      public string DescricaoDetalhada => $"O carro {Modelo} fabricado pela {Fabricante} no ano {Ano}";
      

Por que ambas funcionam?

Porque o C# permite múltiplas propriedades diferentes, mesmo que retornem coisas parecidas.
O problema é que você está chamando as duas no Program.cs:

Console.WriteLine(carro1.DescricaoDetalhada);
Console.WriteLine(carro1.DescricãoDetalhada);

Se ambas existirem, o código compila e imprime duas mensagens diferentes.
Mas se uma delas for removida, e você tentar chamar a que não existe, o programa não compila.

  • Sobre o Ano:
    A lógica serve para validar o dado antes de armazená-lo, protegendo o objeto contra erros.

  • Sobre as descrições:
    Ambas funcionam, mas mantenha apenas uma propriedade com nome sem acento.
    Use nomes claros e padronizados, por exemplo:

    public string DescricaoDetalhada => $"O carro {Modelo} fabricado pela {Fabricante} no ano {Ano}";
    
  • Dica geral:
    Use propriedades (get/set) sempre que quiser controlar ou validar a atribuição de valores internos na classe.
    Isso é um dos pilares da orientação a objetos: o encapsulamento.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Obrigado mas deixa ver se entendi
Primeira parte como o campo ano está no private o acesso fica restrito a classe.
Enquanto set valida, get mantem o valor no ano,

=======

Segunda Parte
Não expliquei direito mas foi proposital o** DescricãoDetalhada** queria entender mais a influencia do this

public string DescricãoDetalhada => $"Modelo do carro: {this.Fabricante} {this.Modelo} {this.Ano}";

Esperava uma mensagem de erro mas não houve