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() retorna true se o valor for igual a default(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

  1. Declaramos a classe Caixa<T> com um campo privado valor do tipo T.
  2. O construtor recebe um parâmetro T valor e o atribui ao campo.
  3. O método Abrir() simplesmente retorna o valor armazenado.
  4. EstaVazia() usa EqualityComparer<T>.Default.Equals para comparar o valor com default(T), evitando problemas com tipos que não suportam ==.
  5. No Main, criamos instâncias com int e string e 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 com EqualityComparer<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 EstaVazia em uma instância nula: isso causaria NullReferenceException; 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