1. O que é genérico?
Genéricos são novas sintaxes introduzidas em C# 2.0, não açúcar sintaxe, mas recursos fornecidos pelas atualizações do framework na 2.0.
Quando programamos programas, frequentemente encontramos módulos com funções muito semelhantes, mas que lidam com dados diferentes. Mas não temos escolha a não ser escrever múltiplos métodos separadamente para lidar com diferentes tipos de dados. Neste momento, a questão é: existe uma forma de usar o mesmo método para lidar com diferentes tipos de parâmetros? O surgimento dos genéricos foi especificamente projetado para resolver esse problema.
2. Por que usar genéricos
Vamos dar uma olhada no seguinte exemplo:
Resultado:
Pelos resultados acima, podemos ver que esses três métodos têm as mesmas funções, exceto pelos diferentes parâmetros que eles mantêm. Na época da versão 1.0, não existia o conceito de genéricos, então o que fazer. Acredito que muitas pessoas pensarão na herança de uma das três principais características da POO, sabemos que em C#, objeto é a classe base de todos os tipos, e o código acima é otimizado da seguinte forma:
Resultado:
A partir dos resultados acima, podemos ver que usar o tipo Object atende aos nossos requisitos e resolve a reutilizabilidade do código. Algumas pessoas podem perguntar por que é possível passar int, string, etc., quando está definido como um tipo de objeto? Existem dois motivos:
1. O tipo de objeto é a classe pai de todos os tipos.
2. Por meio da herança, as subclasses possuem todos os atributos e comportamentos da classe pai, e onde quer que a classe mãe apareça, ela pode ser substituída por subclasses.
Mas o método do tipo de objeto acima traz outro problema: boxing e unboxing podem reduzir o desempenho do programa.
A Microsoft introduziu genéricos no C# 2.0, que podem resolver muito bem os problemas acima.
3. Parâmetros genéricos de tipo
Em uma definição genérica de tipo ou método, um parâmetro de tipo é um marcador especificado pelo cliente para um tipo específico quando ele instancia uma variável do tipo genérico. A classe genérica (GenericList<T>) não pode ser usada como está porque não é um tipo verdadeiro; É mais como um projeto para tipos. Para usar o <T>GenericList, o código cliente deve declarar e instanciar um tipo de construto especificando o parâmetro de tipo dentro de colchetes angulares. O argumento de tipo para essa classe específica pode ser qualquer tipo que o compilador reconheça. Você pode criar qualquer número de instâncias do tipo construto, cada uma com um parâmetro de tipo diferente.
O código no exemplo acima pode ser modificado da seguinte forma:
Chamada:
Mostrar resultados:
|