Muitas vezes encontramos em nossos projetos blocos de códigos que são inevitáveis suas repetições, ocorre muito na criação de CRUDs por exemplo*.* Por isso, seria ótimo se houvesse uma solução “genérica” para esse problema e que os desenvolvedores possam evitar reescrita de código, vale ressaltar que essa prática faz parte de um dos princípios mais fundamentais da programação conhecido como DRY, Don’t Repeat Yourself.
O Generics então significa ser não específico para um determinado tipo de dados, isso permite que você possa definir um método, classe, sctruct ou interface usando o parâmetro de tipo e sem o tipo de dado específico.
Uma classe genérica pode ser uma classe base, bem como uma classe derivada. Seus principais benefícios são
Um tipo genérico é declarado especificando um parâmetro de tipo entre colchetes angulares <T>
. Podemos usar qualquer caractere, mas é bastante comum nomear um tipo genérico como “T”.
NomeTipo<T>, onde **T é o parâmetro de tipo**
Vemos abaixo um exemplo de três implementações genéricas, sendo elas: classes, interfaces e métodos.
public class ClasseGeneric<T>
{
// código
}
public InterfaceGeneric<T>
{
// código
}
public class ClasseGeneric<**T1, T2**>
{
// código
}
Vamos agora para um exemplo prático.
public class ObjetoExemplo<T>
{
}
No exemplo acima o ObjetoExemplo é o nome da classe e o T é o parâmetro do tipo. Esse parâmetro pode ser usado para os campos, propriedades, tipos de devolução e delegates dentro da classe.
public class ObjetoExemplo<T>
{
public T Informacao {get; set;}
public void Exibir()
{
Console.Writeline(this.Informacao);
}
}
Podemos ver acima que a Informacao
é uma propriedade presente na classe ObjetoExemplo
do tipo T
, ou seja, genérica. Então o método Exibir
servirá a qualquer tipo de informação.
É possível também definir mais de um tipo genérico em nossa classe.
public class ObjetoExemploComposto<TKey, TValue>
{
public TKey Chave { get; set; }
public TValue Valor { get; set; }
public void Exibir()
{
Console.WriteLine("Chave: " + Chave + " Valor: " + Valor);
}
}
Fazer a instância de uma classe genérica é semelhante a uma classe regular. Mas além disso, o tipo tem que ser especificado.