Fácil C#
Classe genérica Caixa
Enunciado
Crie uma classe genérica Caixa<T> que armazena um valor do tipo T. Ela deve ter um método Abrir() que retorna o valor armazenado e um método EstaVazia() que indica se o valor é o padrão do tipo T (use default(T)).
Requisitos
- A classe deve ser genérica:
Caixa<T>. - Deve ter um construtor que recebe um valor do tipo T e o armazena.
Abrir()retorna o valor armazenado.EstaVazia()retornatruese o valor for igual adefault(T).
Código inicial
using System;
public class Caixa<T>
{
// implemente aqui
}
class Program
{
static void Main()
{
var caixaInt = new Caixa<int>(10);
Console.WriteLine(caixaInt.Abrir()); // 10
Console.WriteLine(caixaInt.EstaVazia()); // False
var caixaString = new Caixa<string>(null);
Console.WriteLine(caixaString.EstaVazia()); // True
}
}
Saída esperada
10
False
True
Ver dica
Use EqualityComparer<T>.Default.Equals(valor, default(T)) para comparar com o padrão de forma segura.
Mostrar solução
using System;
using System.Collections.Generic;
public class Caixa<T>
{
private readonly T valor;
public Caixa(T valor)
{
this.valor = valor;
}
public T Abrir() => valor;
public bool EstaVazia() => EqualityComparer<T>.Default.Equals(valor, default(T));
}
class Program
{
static void Main()
{
var caixaInt = new Caixa<int>(10);
Console.WriteLine(caixaInt.Abrir()); // 10
Console.WriteLine(caixaInt.EstaVazia()); // False
var caixaString = new Caixa<string>(null);
Console.WriteLine(caixaString.EstaVazia()); // True
}
}
Passo a passo
- Declaramos a classe
Caixa<T>com um campo privadovalordo tipo T. - O construtor recebe um parâmetro
T valore o atribui ao campo. - O método
Abrir()simplesmente retorna o valor armazenado. EstaVazia()usaEqualityComparer<T>.Default.Equalspara comparar o valor comdefault(T), evitando problemas com tipos que não suportam==.- No
Main, criamos instâncias comintestringe testamos os métodos.
Por que funciona
O uso de default(T) permite verificar se o valor é o padrão para qualquer tipo T, seja ele numérico (0), referência (null) ou struct. A classe genérica se adapta a qualquer tipo sem duplicação de código.
Erros comuns
- Usar
valor == default(T)diretamente: isso não compila para tipos genéricos sem restrição, pois o operador==não está disponível para todos os tipos. Corrija comEqualityComparer<T>.Default.Equals. - Esquecer de inicializar o campo no construtor: o compilador exige que todos os campos sejam atribuídos antes de sair do construtor.
- Tentar chamar
EstaVaziaem uma instância nula: isso causariaNullReferenceException; o método deve ser chamado em objeto válido.
Outra forma de resolver
Se T fosse restrito a class, poderíamos usar valor == null. Mas a solução com EqualityComparer é mais geral.
Saída esperada
10
False
True