0Pricing
C# Academy · Aula

Classes genéricas

Tipos de contêiner reutilizáveis.

Classes genéricas é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

O que é uma classe genérica?

Uma classe genérica declara um ou mais parâmetros de tipo entre colchetes angulares após o nome da classe. Esses parâmetros podem ser usados em campos, propriedades, assinaturas de métodos e tipos de retorno em toda a classe.

Isso permite escrever um único contêiner ou serviço que funcione com muitos tipos de elementos, mantendo a tipagem forte.

class Box<T>
{
    public T Value { get; set; }
}

Construindo uma classe genérica

Para criar uma instância, forneça um argumento de tipo concreto. Box<int> e Box<string> são tipos construídos distintos.

Cada tipo construído se comporta como se seu T tivesse sido substituído pelo tipo real em todos os lugares.

using System;

class Box<T> { public T Value { get; set; } }

class Program
{
    static void Main()
    {
        var b = new Box<int> { Value = 7 };
        Console.WriteLine(b.Value);
    }
}

Campos e propriedades genéricos

Os parâmetros de tipo funcionam como tipos de campos e propriedades. Uma pilha, fila ou memória cache costuma armazenar seus dados em uma matriz ou lista de T.

O armazenamento interno mantém a segurança de tipos sem conversões.

class Pair<T>
{
    public T First;
    public T Second;
}

Vários parâmetros de tipo

Uma classe pode aceitar vários parâmetros de tipo. Um par de chave/valor ou um tipo no estilo de dicionário costuma usar dois.

Nomes descritivos como TKey e TValue melhoram a legibilidade quando há mais de um parâmetro.

class Entry<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

Uma pilha genérica simples

Aqui está uma pequena pilha genérica baseada em uma List<T>. Push adiciona ao final e Pop remove do final.

A mesma classe funciona com valores int, cadeias de caracteres ou qualquer tipo por referência ou tipo de valor.

using System;
using System.Collections.Generic;

class MyStack<T>
{
    private readonly List<T> items = new();
    public void Push(T item) => items.Add(item);
    public T Pop()
    {
        var i = items[^1];
        items.RemoveAt(items.Count - 1);
        return i;
    }
}

class Program
{
    static void Main()
    {
        var s = new MyStack<string>();
        s.Push("a");
        s.Push("b");
        Console.WriteLine(s.Pop());
    }
}

Métodos genéricos dentro de classes genéricas

Uma classe genérica também pode declarar parâmetros de tipo adicionais em métodos individuais. Esses parâmetros no nível do método são independentes dos parâmetros no nível da classe.

Isso acrescenta flexibilidade, por exemplo, permitindo converter o tipo armazenado em outro tipo.

class Box<T>
{
    public T Value;
    public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}

Restrições na classe

Assim como os métodos, uma classe genérica pode restringir seus parâmetros de tipo com where. Uma restrição se aplica a cada membro que usa esse parâmetro.

A seguir, where T : class permite atribuir null e comparar referências.

class Repository<T> where T : class
{
    private T current;
    public bool IsEmpty => current is null;
}

Membros estáticos são específicos de cada tipo

Cada tipo genérico construído recebe sua própria cópia de quaisquer campos estáticos. Counter<int> e Counter<string> mantêm contagens separadas.

Essa é uma diferença sutil, mas importante, em relação às classes não genéricas.

class Counter<T>
{
    public static int Count;
}

Valores padrão em classes genéricas

Dentro de uma classe genérica, muitas vezes é necessário um valor inicial para um campo do tipo T. Use default(T) ou o default mais curto quando o tipo for conhecido pelo contexto.

Ele produz null para tipos por referência e o valor zero para tipos de valor.

class Slot<T>
{
    public T Value = default!;
    public bool HasValue { get; private set; }
}

Herdando de uma classe genérica

Você pode derivar de uma classe base genérica. A subclasse pode fixar o argumento de tipo ou continuar sendo genérica.

Fixá-lo especializa a classe base; continuar sendo genérica encaminha o parâmetro para cima.

class Box<T> { public T Value; }

class IntBox : Box<int> { }

class NamedBox<T> : Box<T> { public string Name; }

Genéricos e as coleções integradas

A biblioteca base do .NET está repleta de classes genéricas: List<T>, Dictionary<TKey, TValue> e Queue<T>. Elas são o principal benefício prático do design de classes genéricas.

Escrever seus próprios tipos genéricos permite ampliar esse mesmo estilo seguro e reutilizável.

using System.Collections.Generic;

var scores = new Dictionary<string, int>();
scores["ada"] = 95;

Verificação rápida

Teste sua compreensão das classes genéricas.

Recapitulação

As classes genéricas declaram parâmetros de tipo após o nome da classe e os usam em campos, propriedades e métodos. Você as constrói com argumentos de tipo concretos, criando tipos distintos.

Elas podem adicionar parâmetros de tipo no nível dos métodos, incluir restrições where, ser herdadas e manter estado estático específico de cada tipo. As coleções integradas são o principal exemplo.

Perguntas Frequentes

A aula “Classes genéricas” é grátis?

Sim — o texto completo de “Classes genéricas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Classes genéricas”?

Tipos de contêiner reutilizáveis. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Classes genéricas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Métodos genéricos
  2. Classes genéricas
  3. Restrições where
  4. Interfaces genéricas
← Voltar para C# Academy