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.