Compartilhar via


Benefícios do Generics (guia de programação C#)

Classes genéricas fornecem a solução a uma limitação nas versões anteriores do common linguagem tempo de execução e o linguagem translation from VPE for Csharp no qual generalização é realizada por tipos de projeção e para o tipo de base universal Object. Criando uma classe genérica, você pode criar uma coleção que é segurança de tipos em time de compilar.

As limitações do uso de classes de coleções não genéricas podem ser demonstradas por escrever um pequeno programa que usa o ArrayList classe de coleção da biblioteca de classes .NET estrutura. ArrayList é uma classe de coleção altamente conveniente que pode ser usada sem modificação para armazenar qualquer tipo de valor ou referência.

// The .NET Framework 1.1 way to create a list:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);

System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

Mas essa conveniência aumenta a um custo.Qualquer tipo de valor ou referência que é adicionado a um ArrayList é implicitamente upcast para Object. Se os itens forem tipos de valores, eles devem ser processador quando forem adicionados à lista e desencaixotado, montados quando são recuperados.Tanto a transmissão e as operações de conversão boxing e conversão conversão unboxing diminuem o desempenho; o efeito de conversão boxing e conversão conversão unboxing pode ser muito significativo em cenários em que você deve iterar grandes coleções.

Outros limitação é a falta de verificação; de tipos em time de compilar porque uma ArrayList Projeta que tudo Object, não é possível em time de compilar para impedir que o código de cliente fazendo algo sistema autônomo este:

System.Collections.ArrayList list = new System.Collections.ArrayList();
// Add an integer to the list.
list.Add(3);
// Add a string to the list. This will compile, but may cause an error later.
list.Add("It is raining in Redmond.");

int t = 0;
// This causes an InvalidCastException to be returned.
foreach (int x in list)
{
    t += x;
}

Embora perfeitamente aceitável e intencionais, às vezes, se você estiver criando um conjunto heterogêneo, combinando as seqüências de caracteres e ints em um único ArrayList mais provavelmente será um erro de programação, e esse erro não será detectado até que o tempo de execução.

Nas versões 1.0 e 1.1 do linguagem translation from VPE for Csharp, você pode evitar os perigos de código generalizado em classes de coleção do .NET estrutura classe base biblioteca apenas escrevendo suas próprias coleções de tipo específico.Obviamente, como essa classe não é reutilizável para mais de um tipo de dados, você perder os benefícios da generalização e você tenha que reescrever a classe para cada tipo será armazenado.

O ArrayList e Outros classes semelhantes realmente precisam é uma forma de código do cliente especificar, em uma base por instância, o tipo de dados específico que pretendem usar. Que eliminaria a necessidade de elevação para T:System.Object e poderia também tornam possível para o compilador a verificação de tipo. Em outras palavras, ArrayList precisa de um parâmetro de tipo. É exatamente o que fornecem os genéricos.No genérico List<T> coleção, nas N:System.Collections.Generic espaço para nome, a mesma operação de adicionar itens à coleção parece com isso:

// The .NET Framework 2.0 way to create a list
List<int> list1 = new List<int>();

// No boxing, no casting:
list1.Add(3);

// Compile-time error:
// list1.Add("It is raining in Redmond.");

Para obter um código de cliente, a sintaxe adicionado apenas com List<T> em comparação com ArrayList é o argumento de tipo na declaração e instanciação. Em troca para essa codificação ligeiramente mais complexidade, você pode criar uma lista que não é apenas mais segura do que ArrayList, mas também significativamente mais rápidos, especialmente quando os itens da lista são tipos de valor.

Consulte também

Conceitos

Guia de Programação C#

Referência

Introdução ao Generics (guia de programação C#)

System.Collections.Generic

conversão boxing e conversão conversão unboxing (guia de programação translation from VPE for Csharp)

Outros recursos

Conjuntos de práticas recomendadas