Udostępnij za pośrednictwem


Omówienie produktów pierwotnych w programie Visual C++

Generyczne są sparametryzowana typów obsługiwanych przez aparat plików wykonywalnych języka wspólnego.typ z parametrami jest typem zdefiniowanego za pomocą nieznanego typu parametr , który jest określony, gdy używany jest ogólny.

Dlaczego generyczne?

C++ obsługuje szablonów i zarówno szablonów i typy ogólne obsługi typów sparametryzowana, aby utworzyć wpisane klasy kolekcji.Jednak szablony udostępniają kompilować-parametryzacja czasu.Nie można odwoływać się zestaw zawierającego definicję szablon i utworzyć nowych specjalizacji szablon.Po skompilowany, wyspecjalizowane szablon wygląda jak klasy lub metoda.Natomiast typy ogólne są emitowane w MSIL jako typ z parametrami , znany w czasie wykonywania, typ z parametrami; Kod źródłowy, który odwołuje się do zestaw zawierające typ ogólny można utworzyć specjalizacji typ ogólny.Aby uzyskać więcej informacji na porównanie szablony Visual C++ i typy ogólne, zobacz Generyczne i szablony (Visual C++).

Rodzajowy funkcji i typów

Typy klas, jak długo są typy zarządzane, mogą być rodzajowy.Przykładem tego może być List klasy.Typ obiekt , na liście byłoby typu parametr.Jeśli potrzebne List klasy dla wielu różnych typów obiektów przed typy ogólne , być może użyto List , które przekieruje System::Object jako typ elementu.Ale czy zezwala na dowolny obiekt (w tym obiektów niewłaściwy typ) ma być używany na liście.Wykaz taki zostanie wywołana klasa bez typu kolekcji.W najlepszym możesz sprawdzić typ w czasie wykonywania i zgłoś wyjątek.Lub może być używany jako szablon, który stracą jego jakości rodzajowy raz skompilowany do zestaw.Konsumentów na zestaw może nie utworzyć swoje własne specjalizacji szablon.Generyczne pozwalają utworzyć wpisane klasy kolekcji, powiedz List<int> (odczyt jako "Lista int") i List<double> ("List of double") która generowałaby kompilować-błąd w czasie jeżeli Próbowano wstawić typ, który nie był kolekcji zaprojektowaną w celu akceptowania maszynowy kolekcji.Ponadto te typy nadal rodzajowy, są one skompilowany.

Opis składni klas rodzajowych można znaleźć w Klasy rodzajowe (C + +/ CLI). nowego przestrzeń nazw System.Collections.Generic, wprowadzono zestaw typów kolekcji sparametryzowana, łącznie z Dictionary<TKey, TValue>, List<T> i LinkedList<T>.Zobacz Generyczne w.NET Framework Class Library (Podręcznik programowania C#) Aby uzyskać więcej informacji.

Zarówno funkcje składowe klasy instancji i statyczny , delegatów i funkcje globalne mogą być również rodzajowy.Ogólne funkcje może być konieczne są parametry funkcjanieznanego typu lub sama funkcja musi pracować z typami ogólnymi.W wielu przypadkach gdy System::Object zostały użyte w przeszłości jako parametr typu nieznany obiekt typ ogólnyparametr może być używany zamiast, pozwalając na więcej typu -kod bezpieczny. Każda próba przekazania w polu Typ, że funkcja nie została zaprojektowana dla zostanie oznaczony jako błąd w czasie kompilować .Za pomocą System::Object jako funkcjaparametr, przekazywanie nieumyślnemu obiekt że funkcja pomyślana, zmierzających do mogłoby nie być wykrywana i trzeba będzie rzutować typu nieznany obiekt do określonego typu w treści funkcja i uwzględniać możliwość InvalidCastException. Z rodzajowego kod próby przekazać obiekt do funkcja mogłoby spowodować konflikt typów tak jest gwarantowane ma poprawny typ treści funkcja .

Te same korzyści, stosuje się do klasy kolekcji zabudowę typy ogólne.Użyć klasy zbioru w przeszłości System::Object do przechowywania elementów w kolekcji.Wstawiania obiektów typu kolekcji nie zaprojektowano z myślą o została oflagowana nie w czasie kompilować , a często nawet w przypadku, gdy obiekty nie zostały wstawione.Zazwyczaj, obiekt będzie można rzutować na innego typu, gdy dostęp do niej był w kolekcji.Tylko w przypadku, gdy nie Obsada byłoby nieoczekiwany typ zostać wykryte.Generyczne rozwiązuje ten problem w czasie kompilować przez wykrywanie wszelkich kod, który wstawia typu, która nie odpowiada (lub niejawnie konwertować ) typu parametr rodzajowej kolekcji.

Opis składni, zobacz Ogólne funkcje (C + +/ CLI).

Terminologia używana z generyczne

c570k3f3.collapse_all(pl-pl,VS.110).gifParametrów typu

Rodzajowy deklaracja zawiera jeden lub więcej typów nieznany, znany jako Parametry typu.Parametrów typu są podane nazwy, która jest skrótem od typu w treści zgłoszenia rodzajowy.Typ parametr jest używany jako typ w treści zgłoszenia rodzajowy.Rodzajowy zgłoszenia do listy <T> zawiera typ parametr T.

c570k3f3.collapse_all(pl-pl,VS.110).gifArgumenty typu

Typu argument jest rzeczywisty typ używany zamiast typu parametr , kiedy ogólny jest wyspecjalizowane dla określonego typu lub typów.Na przykład int jest typem argument w List<int>.Typy wartości i typy dojście są tylko typy dozwolone w jakoargument typ ogólny.

c570k3f3.collapse_all(pl-pl,VS.110).gifSkonstruowane typu

Typ, wykonane z typ ogólny nazywa się skonstruowane typu.Typ, nie w pełni określony, takich jak List<T> jest otwarty zbudowane typu; Typ, w pełni określony, takich jak List<double>, jest zamkniętego typu konstruowanej lub wyspecjalizowany typ.Otwórz konstruowanej typów mogą być używane w definicji inne typy rodzajowe lub metody i może nie być całkowicie określony aż otaczający rodzajowy jest określony.Na przykład następujące jest wykorzystanie typu otwarty skonstruowane jako klasa podstawowa dla rodzajowego:

// generics_overview.cpp

// compile with: /clr /c

generic <typename T>

ref class List {};

generic <typename T>

ref class Queue : public List<T> {};

c570k3f3.collapse_all(pl-pl,VS.110).gifOgraniczenie

ograniczenie jest ograniczenie na typy, które mogą być używane jako typ parametr.Na przykład danej klasy rodzajowy może akceptować tylko klasy, które dziedziczą z klasy określonej lub wykonania określonego interfejs.Aby uzyskać więcej informacji, zobacz Ograniczenia rodzajowy wpisz parametry (C + +/ CLI).

Typy odwołań i typów wartości

Uchwyty typów i typy wartości może służyć jako argumentów typu.W definicji rodzajowy, w której typ może być używany, składnia jest, że typy odwołań.Na przykład **->**do członków typu typ parametr dostępu, niezależnie od tego, czy typ ostatecznie używany jest typ referencyjny lub typ wartościużywany jestoperator . typ wartości jest używana jako argumenttypu, aparat plików wykonywalnych generuje kod, który używa typów wartości bezpośrednio, bez konwersja boxing typów wartości.

Gdy używany jest typ referencyjny jakoargument typ ogólny, należy użyć składni dojście . Gdy używany jest typ wartości jakoargument typ ogólny, nazwa typu należy użyć bezpośrednio.

// generics_overview_2.cpp

// compile with: /clr

generic <typename T>

ref class GenericType {};

ref class ReferenceType {};

value struct ValueType {};

int main() {

GenericType<ReferenceType^> x;

GenericType<ValueType> y;

}

Parametrów typu

Parametry typu rodzajowego klasy są traktowane jak innych identyfikatorów.Jednakże ponieważ typ nie jest znany, istnieją ograniczenia dotyczące ich stosowania.Na przykład nie można używać członków i metody klasy parametr typu, chyba że jest znany typ parametr , do obsługi tych członków.Oznacza to aby członek typu parametr, należy dodać typ, który zawiera element członkowski do listy ograniczenie typu parametr.

// generics_overview_3.cpp

// compile with: /clr

interface class I {
   void f1();
   void f2();
};

ref struct R : public I {
   virtual void f1() {}
   virtual void f2() {} 
   virtual void f3() {} 
};

generic <typename T>
where T : I
void f(T t) {
   t->f1();
   t->f2();
   safe_cast<R^>(t)->f3();
}

int main() {
   f(gcnew R());
}

Ograniczenia te dotyczą podmiotów gospodarczych, jak również.Nieograniczony typ ogólnyparametr nie może używać == i != operatorów do porównywania dwóch wystąpień tego typu parametr, w przypadku, gdy typ nie obsługuje tych operatorów. Kontrole te są niezbędne dla typy ogólne, ale nie dla szablonów, ponieważ typy ogólne może wyspecjalizowane w czasie wykonywania z dowolnej klasy, spełnia ograniczenia, kiedy jest za późno Aby sprawdzić, czy wykorzystanie nieprawidłowy członków.

Domyślnym wystąpieniem typu parametr może zostać utworzony za pomocą () operator. Na przykład:

T t = T();

gdy T typ parametr rodzajowego definicji klasy lub metoda , inicjuje zmienna na wartość domyślna.Jeśli T jest klasą ref, będzie on pusty wskaźnik; Jeśli T jest klasą wartości obiekt jest zainicjowany na zero.Jest to tak zwane domyślne inicjatora.

Zobacz też

Inne zasoby

Typy ogólne (C++ Component Extensions)