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

[Dúvida] Desafio 5

Eu dei uma olhada na resolução do instrutor pro exercício 5 e a resposta é essa:

class ProdutoRestaurante
{
    public string Nome { get; set; }
    public decimal Preco { get; set; }
}

class Mesa
{
    public int Numero { get; set; }
    public List<Pedido> Pedidos { get; set; } = new List<Pedido>();
}

class Pedido
{
    public ProdutoRestaurante Produto { get; set; }
    public int Quantidade { get; set; }
}

class Cardapio
{
    public List<ProdutoRestaurante> Itens { get; set; } = new List<ProdutoRestaurante>();
}

class Restaurante
{
    public List<Mesa> Mesas { get; set; } = new List<Mesa>();
    public Cardapio Cardapio { get; set; } = new Cardapio();
}

Aí com base nisso eu tentei fazer algo parecido pro último exercício desse módulo, que é fazer a classe Genero e atrelar ela à classe Musica.

Só que deu errado, porque eu tentei escrever public Genero Genero { get; set; } na classe Musica e depois NomeDaMusica.Genero.Nome = "Metal"; no Program.cs, o que resultou em um Unhandled Exception.

O motivo: Eu não instanciei o Objeto Genero antes de declarar o Nome dele, o que até faz sentido e eu consigo entender.

Ou seja, eu deveria ter escrito assim: public Genero Genero { get; set; } = new Genero();

Mas o que eu não consigo entender é que, no código do instrutor, ele faz a mesma coisa pro ProdutoRestaurante Produto { get; set; }, ele não instancia esse Objeto, apenas escreve a propriedade e prossegue com o código.

Estou confuso quanto a isso.

3 respostas

Oii, Felipe.

Preciso de mais informações para entender sua dúvida. Siga as orientações do guia de como fazer uma boa pergunta no fórum e me retorne com as informações pedidas.

Um abraço.

Minha dúvida é a seguinte: quando chamamos uma Classe previamente criada, nós precisamos instanciar ela usando o new(), porém, no código fornecido pelo próprio instrutor, ele chama a classe public ProdutoRestaurante Produto { get; set; } sem instanciar ela usando o new(). Por quê?

solução!

Oii, Felipe!

A questão aqui é que o código do instrutor é apenas a modelagem das classes e não inclui a parte da lógica onde os objetos são efetivamente criados e manipulados.

Quando você escreveu:

NomeDaMusica.Genero.Nome = "Metal";

E recebeu um NullReferenceException, foi porque Genero ainda não tinha sido instanciado. A solução foi inicializar a propriedade assim:

public Genero Genero { get; set; } = new Genero();

Isso garante que Genero nunca será null, permitindo que você acesse Genero.Nome diretamente.

Agora, voltando ao código do instrutor:

class Pedido
{
    public ProdutoRestaurante Produto { get; set; }
    public int Quantidade { get; set; }
}

Aqui, Produto também começa como null, mas o código não deu erro porque o instrutor ainda não tá manipulando os objetos. Ele apenas definiu as classes e suas propriedades, sem a lógica para criar e associar instâncias.

Se houvesse um trecho de código onde um pedido fosse criado e um produto fosse associado, algo assim seria necessário:

Pedido novoPedido = new Pedido();
novoPedido.Produto = new ProdutoRestaurante { Nome = "Pizza", Preco = 30.00m };

Como essa parte não faz parte da modelagem exigida no desafio, ela não aparece na resposta do instrutor.

Então, a diferença tá no momento em que a instância do objeto é necessária. No seu caso, você tentou acessar uma propriedade (Genero.Nome) antes de criar o objeto, enquanto no código do instrutor essa situação nunca ocorre porque o código não chega a acessar Produto.Nome diretamente.

Espero que agora tenha ficado claro.

Um abraço e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓

bons estudos