Udostępnij za pośrednictwem


Generyczne w czasie uruchomienia (Podręcznik programowania C#)

Gdy typ rodzajowy lub metoda jest skompilowany w Microsoft intermediate language (MSIL), zawiera metadane, który identyfikuje go jako posiadające parametrów typu.Różnice MSIL dla typu rodzajowego jest używana między na podstawie tego, czy parametr typu podany jest wartością typu lub typ odwołania.

Podczas typu rodzajowego jest najpierw zbudowane z typem wartości jako parametru, aparat plików wykonywalnych tworzy specjalistyczne typu rodzajowego z dostarczonego parametru lub parametrów podstawione w odpowiednich miejscach w MSIL.Specjalistyczne typy rodzajowe są tworzone raz dla każdego typu unikatowych wartości, który jest używany jako parametr.

Na przykład załóżmy, że zgłoszone stosu, która jest skonstruowana liczb całkowitych kodu programu:

Stack<int> stack;

W tym momencie środowiska wykonawczego generuje specjalistyczne wersji Stack<T> klasy, która jest liczbą całkowitą, jej parametr zastąpione odpowiednio.Teraz, w każdym przypadku, gdy kod program używa stosu liczb całkowitych, wyspecjalizowane wygenerowanej powtórnych runtime Stack<T> klasy.W poniższym przykładzie tworzone są dwa wystąpienia stosu liczb całkowitych i posiadają jedno wystąpienie Stack<int> kodu:

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

Przypuśćmy jednak, że innego Stack<T> klasy z typem różnych wartości, takie jak long lub struktury zdefiniowane przez użytkownika, jako jej parametr zostanie utworzony w innym punkcie w kodzie.W efekcie środowiska wykonawczego generuje inną wersję typu rodzajowego i substytuty long w odpowiednich miejscach w MSIL.Konwersje są już potrzebne, ponieważ każdy specjalistyczne klasą rodzajową macierzyście zawiera typ wartości.

Generyczne działa nieco inaczej dla typu odwołania.Po raz pierwszy typ rodzajowy jest zbudowane z dowolnego typu odwołanie środowiska wykonawczego tworzy specjalistyczne typu rodzajowego z podstawione dla parametrów w MSIL odwołań dotyczących obiektów.Następnie ilekroć dany typ konstruowanej jest skonkretyzowany za pomocą typu odwołania jako jej parametr niezależnie od typu, jaki jest, środowisko wykonawcze używa utworzonego uprzednio wyspecjalizowane wersji typu rodzajowego.Jest to możliwe, ponieważ wszystkie odwołania mają taki sam rozmiar.

Załóżmy na przykład, miał dwa typy odwołań, Customer klasy i Order klasy i Załóżmy, że utworzono stos Customer typów:

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

W tym momencie środowiska wykonawczego generuje specjalistyczne wersji Stack<T> klasy, która przechowuje odwołań dotyczących obiektów, które będą wypełniane później zamiast przechowywania danych.Załóżmy, że następny wiersz kodu tworzy stos innego typu odwołanie, którego nazwą jest Order:

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

W odróżnieniu od z typów wartości innym specjalistyczny wersji Stack<T> klasy nie jest tworzony dla Order typu.Zamiast tego wystąpienia specjalistyczne wersji Stack<T> klasy jest tworzony i orders zmienna jest ustawiana, aby odwołać się do.Załóżmy, że napotkano następnie tych linii kodu, aby utworzyć stos Customer typu:

customers = new Stack<Customer>();

Podobnie jak w przypadku stosowania poprzedniego Stack<T> utworzone za pomocą klasy Order wpisz inną instancję wyspecjalizowanych Stack<T> klasy jest tworzony.Wskaźniki, które są w niej zawarte są ustawione aby odwołać się za obszar pamięci rozmiar Customer typu.Ponieważ liczba typów odwołań zależą od drgania w od programu, realizacji C# generyczne znacznie zmniejsza ilość kodu poprzez zmniejszenie jedną liczbę wyspecjalizowanych klas utworzonych przez kompilator dla klasy rodzajowe typy odwołań.

Ponadto kiedy ogólny klasy C# jest za pomocą wartości parametru typu typ lub odwołanie, odbicie można go kwerendy w czasie wykonywania i zarówno jego rzeczywisty typ, jak i jej parametr typu można stwierdzić.

Zobacz też

Informacje

Wprowadzenie do generyczne (Podręcznik programowania C#)

System.Collections.Generic

Koncepcje

Podręcznik programowania C#

Inne zasoby

Generyczne w.NET Framework