Share via


Genéricos no time de execução (guia de programação translation from VPE for Csharp)

Quando um tipo genérico ou método é compilado em Microsoft intermediate linguagem (MSIL), ele contém metadados que o identifica sistema autônomo tendo sistema autônomo parâmetros de tipo.Como o MSIL para um tipo genérico é usado difere dependendo se o parâmetro de tipo fornecido é um valor tipo ou tipo de referência.

Quando um tipo genérico é construído pela primeira vez com um tipo de valor sistema autônomo um parâmetro, o tempo de execução cria um tipo genérico especializado com o parâmetro fornecido ou parâmetros substituídos nos locais apropriados na MSIL.Tipos genéricos especializados são criados uma vez para cada tipo de valor exclusivo que é usado sistema autônomo um parâmetro.

Por exemplo, suponha que seu código de programa declarado uma pilha é construída de inteiros:

Stack<int> stack;

Neste ponto, o tempo de execução gera uma versão especializada do Stack<T> classe que tenha o inteiro substituído apropriadamente para seu parâmetro. Agora, sempre que seu código de programa utiliza uma pilha de inteiros, o tempo de execução reutiliza o especializados gerado Stack<T> classe. No exemplo a seguir, duas instâncias de uma pilha de inteiros são criadas e eles compartilhem uma única instância do Stack<int> código:

Stack<int> stackOne = new Stack<int>();
Stack<int> stackTwo = new Stack<int>();

No entanto, suponha que outra Stack<T> classe com um tipo de valor diferentes, sistema autônomo um long ou uma estrutura definida pelo usuário sistema autônomo seu parâmetro é criada em outro ponto no seu código. sistema autônomo resultado, o tempo de execução gera outra versão do tipo genérico e substitui um long nos locais apropriados na MSIL. Conversões não são mais necessárias porque cada classe genérica especializado nativamente contém o tipo de valor.

Classes genéricas funcionam de modo um pouco diferente para tipos de referência.Na primeira vez um tipo genérico é construído com qualquer referência a tipo, o time de execução cria um tipo genérico especializado com referências a objetos substituídas por parâmetros na MSIL.Em seguida, sempre que um tipo construído é instanciado com um tipo de referência sistema autônomo seu parâmetro, independentemente do tipo é, o time de execução reutiliza a versão criada anteriormente especializada do tipo genérico.Isso é possível porque todas as referências são do mesmo dimensionar.

Por exemplo, suponha que você tinha dois tipos de referência, um Customer classe e um Order classe e suponha também que você criou uma pilha de Customer tipos:

class Customer { }
class Order { }
Stack<Customer> customers;

Neste ponto, o tempo de execução gera uma versão especializada do Stack<T> classe que armazena as referências de objeto serão preenchidas posteriormente, em vez de armazenar dados. Suponha que a próxima linha de código cria uma pilha de outro tipo de referência, que é nomeada Order:

Stack<Order> orders = new Stack<Order>();

Ao contrário com tipos de valor, outro especializado versão do Stack<T> classe não foi criado para o Order Digite. Em vez disso, uma instância da versão especializada do Stack<T> classe é criada e o orders variável é definida para fazer referência a ela. Suponha que você encontrou, em seguida, uma linha de código para criar uma pilha de um Customer tipo:

customers = new Stack<Customer>();

sistema autônomo com o uso anterior do Stack<T> classe criada usando o Order Digite outra instância do especializados Stack<T> classe é criada. Os ponteiros são nele contidos estão definidos para fazer referência a uma área da memória o dimensionar de um Customer Digite. Como o número de tipos de referência pode variar totalmente de um programa para outro, a implementação translation from VPE for Csharp genéricos bastante reduz a quantidade de código, reduzindo a um o número de classes especializadas criado pelo compilador para classes genéricas de tipos de referência.

Além disso, quando uma classe genérica translation from VPE for Csharp é instanciada, usando um parâmetro de tipo de valor de tipo ou referência, reflexão pode consulta-la no tempo de execução e seu tipo real e seu parâmetro de tipo pode ser apurada.

Consulte também

Conceitos

Guia de Programação C#

Referência

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

System.Collections.Generic

Outros recursos

Classes genéricas no .NET Framework