Partilhar via


Vantagens e Limitações dos Genéricos

Permitindo que você especifique tipos que são acionados por uma classe genérica ou método, o recurso Genéricos desloca a carga do tipo de segurança para o compilador. Não é necessário escrever código para testar o tipo de dados correto porque isso é aplicado em tempo de compilação. A necessidade de converter tipos e a possibilidade de erros em tempo de execução são reduzidas.

Os Genéricos oferecem segurança sem a sobrecarga de várias implementações de tipo. Por exemplo, você pode criar uma lista ligada de sequências de caracteres com a declaração de variável a seguir:

Dim llist As New LinkedList(Of String)()
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

Não há necessidade de herdar de um tipo base e substituir membros. A lista vinculada está pronta para uso imediato. Consulte System.Collections.Generic e System.Collections.ObjectModel para os tipos de coleções genéricas fornecidos pelo .NET Framework.

Além da segurança de tipo, tipos de coleções genéricas geralmente executam melhor armazenazenamento e manipulação dos tipos de valor porque não há necessidade de encapsular os tipos de valor.

Representantes genéricos ativam retornos de tipo seguro sem a necessidade de criar múltiplos representantes de classes. Por exemplo, o Predicate<T> genérico delegado permite que você crie um método que implemente seus próprios critérios de pesquisa para um tipo específico e use o seu método com métodos do tipo Array como Find<T>,FindLast<T> e FindAll<T>.

Representantes genéricos também podem ser usados dinamicamente no código gerado sem exigir a geração de um representante de tipo. Isso aumenta o número de cenários em que você pode usar métodos dinâmicos leves em vez de gerar conjuntos de módulos inteiros. Para obter mais informações, consulte Como: Definir e executar métodos dinâmicos e DynamicMethod.

Em vários casos, o Visual Basic, Visual C++ e compiladores C# podem determinar a partir do contexto os tipos que são usados por uma chamada de um método genérico, o que simplifica muito a sintaxe para o uso de métodos genéricos. Por exemplo, o código a seguir mostra os formulários curtos e longos para chamar o BinarySearch método genérico para pesquisar uma matriz de sequências de caracteres. No formulário curto, os compiladores inferem o tipo correto do parâmetro a partir dos tipos de argumentos do método.

Dim index0 As Integer = Array.BinarySearch(myArray, "test string")
Dim index1 As Integer = Array.BinarySearch(Of String)(myArray, "test string")
int index0 = Array.BinarySearch(myArray, "test string");
int index1 = Array.BinarySearch<string>(myArray, "test string");
int index0 = Array::BinarySearch(myArray, "test string");
int index1 = Array::BinarySearch<String^>(myArray, "test string");

Limitações dos Genéricos

A seguir estão algumas limitações de classes genéricas na caixa .NET Framework versão 2.0:

  • Tipos genéricos podem ser derivados da maioria das classes base, como MarshalByRefObject (e restrições podem ser usadas para exigir que parâmetros do tipo genérico derivem de classes base como MarshalByRefObject). No entanto, esta versão do .NET Framework não suporta tipos genérico vinculados a contexto. Um tipo genérico que pode ser derivado de ContextBoundObject, mas tentar criar uma instância desse tipo faz com que uma TypeLoadException.

  • Enumerações não podem ter parâmetros do tipo genérico. Uma enumeração pode ser genérica somente por acaso (por exemplo, porque ele é aninhado em um tipo genérico que é definido usando Visual Basic, C# ou C++). Para obter mais informações, consulte "Enumerações" in Common Type System.

  • Métodos dinâmicos leves não podem ser genéricos. Para obter mais informações sobre métodos dinâmicos, consulte Cenários de método dinâmico de emissão de reflexão.

  • No Visual Basic, C# e C++, um tipo aninhado que está fechado em um tipo genérico não pode ser instanciado a menos que tipos tenham sido atribuídos a parâmetros de tipos de todos os tipos de inclusão. Outra maneira de dizer isso é que na reflexão, um tipo aninhado que é definido usando esses linguagens inclui parâmetros de todos os seus tipos de inclusão de tipo. Isso permite que os parâmetros de tipo de inclusão sejam usados nas definições de membro de um tipo aninhado. Para obter mais informações, consulte "Tipos Aninhados" em MakeGenericType.

    Observação

    Um tipo aninhado que é definido pelo código emissor em um conjunto dinâmico ou usando o Ilasm. exe (Assembler MSIL) não é necessário para incluir parâmetros de tipo de seus tipos delimitadores; no entanto, se ele não inclui-los, os parâmetros de tipo não estão no escopo na classe aninhada.

    Para obter mais informações, consulte "Tipos Aninhados" em MakeGenericType.

Consulte também

Referência

System.Collections.Generic

System.Collections.ObjectModel

Conceitos

Classes genéricas no .NET Framework

Coleções Genéricas na .NET Framework

Representantes Genéricos para Manipulação de Matrizes e Listas

Interfaces Genéricas