Generics

Generics são um recurso poderoso do C# que permite criar classes, métodos, interfaces e estruturas com tipos parametrizados, promovendo reutilização de código, segurança de tipos e desempenho otimizado.

O que são Generics?

Generics introduzem o conceito de parâmetros de tipo. Em vez de definir explicitamente um tipo, você usa um “placeholder” (como T), que será substituído pelo tipo real quando a classe ou método for utilizado. Isso elimina a necessidade de conversões em tempo de execução e previne erros de tipo.

Como declarar uma classe genérica

public class Caixa<T>
{
public T Valor;

public Caixa(T valor)
{
Valor = valor;
}

public void Exibir()
{
Console.WriteLine("Valor: " + Valor);
}
}

Aqui, T é o parâmetro de tipo. Você pode criar instâncias da classe para diferentes tipos:

Caixa<int> caixaInt = new Caixa<int>(10);
caixaInt.Exibir(); // Saída: Valor: 10

Caixa<string> caixaString = new Caixa<string>("Olá");
caixaString.Exibir(); // Saída: Valor: Olá

Como declarar um método genérico

Métodos genéricos permitem que funções trabalhem com diferentes tipos sem duplicação de código:

public void Trocar<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}

Uso:

int x = 1, y = 2;
Trocar(ref x, ref y);
// x = 2, y = 1

string s1 = "A", s2 = "B";
Trocar(ref s1, ref s2);
// s1 = "B", s2 = "A"

Generics em coleções

A biblioteca .NET oferece diversas coleções genéricas, como List<T>, Dictionary<TKey, TValue>, entre outras. Elas são preferíveis às coleções não genéricas por oferecerem segurança de tipos e melhor desempenho.

List<string> nomes = new List<string>();
nomes.Add("Maria");
nomes.Add("João");

Restrições em Generics

Você pode restringir o tipo aceito por um parâmetro genérico usando constraints:

csharppublic class Repositorio<T> where T : class
{
    // T deve ser uma classe
}

Benefícios dos Generics

  • Reutilização de código: Escreva uma vez, use com vários tipos.
  • Segurança de tipos: Erros de tipo são detectados em tempo de compilação.
  • Desempenho: Evita boxing/unboxing e casts desnecessários.