Fácil C#
Criando uma auto-property com init
Enunciado
Crie uma classe Pessoa com uma propriedade Nome do tipo string que só possa ser definida na inicialização do objeto (use init). No Main, crie uma instância passando o nome e exiba-o.
Requisitos
- A propriedade
Nomedeve usar{ get; init; }. - O objeto deve ser criado com um inicializador de objeto ou construtor.
- O programa deve compilar e exibir o nome.
Código inicial
using System;
public class Pessoa
{
// TODO: declarar propriedade Nome com init
}
public class Program
{
public static void Main()
{
// TODO: criar pessoa e exibir nome
}
}
Saída esperada
Nome: Ana
Ver dica
Use public string Nome { get; init; } e crie o objeto com new Pessoa { Nome = "Ana" }.
Mostrar solução
using System;
public class Pessoa
{
// Auto-property com init: só pode ser atribuída na criação
public string Nome { get; init; }
}
public class Program
{
public static void Main()
{
// Inicializador de objeto define Nome no momento da construção
var p = new Pessoa { Nome = "Ana" };
Console.WriteLine($"Nome: {p.Nome}");
}
}
Passo a passo
- Declaramos a classe
Pessoacom uma propriedadeNomeusando{ get; init; }. Isso cria um campo de apoio automaticamente e permite leitura e atribuição apenas na inicialização. - No
Main, criamos uma instância dePessoacom a sintaxe de inicializador de objeto:new Pessoa { Nome = "Ana" }. - O compilador chama o
initdeNomedurante a construção, atribuindo o valor. - Depois de criado, o objeto não permite mais alterar
Nome(tentativas geram erro de compilação). - Exibimos o valor com
Console.WriteLine.
Por que funciona
O acessador init é como um set especial que só pode ser chamado durante a inicialização do objeto — seja no construtor, seja em um inicializador de objeto. Isso garante que a propriedade seja imutável após a criação, promovendo segurança e clareza.
Erros comuns
- Tentar alterar depois de criado:
p.Nome = "Bia";gera erro CS8852: "Propriedade ou indexador somente init não pode ser atribuído exceto em um inicializador de objeto ou no construtor". - Esquecer de inicializar: se
Nomenão for atribuído, ele ficanull(para tipos de referência). Userequiredou inicialize no construtor se necessário. - Usar
setem vez deinit: comset, a propriedade poderia ser alterada depois, contrariando o requisito.
Outra forma de resolver
Se precisar de validação, pode usar um construtor:
public Pessoa(string nome) => Nome = nome;
E criar com new Pessoa("Ana"). É preferível quando a lógica de inicialização é mais complexa.
Saída esperada
Nome: Ana