Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Generika sind die parametrisierte Typen, die von der Common Language Runtime unterstützt werden.Ein parametrisierter Typ ist ein Typ, der mit einem unbekannten Typparameter definiert wird, der angegeben wird, wenn das generische verwendet wird.
Generika Warum?
C++ unterstützt Vorlagen und Vorlagen sowie parametrisierte Typen von Generika unterstützen, um typisierte Auflistungsklassen zu erstellen.Allerdings stellen Vorlagen Kompilierzeit parametrisierung.Sie können eine Assembly verweisen, die eine Vorlagendefinition enthält und Spezialisierungen der Vorlage erstellen.Nach der Kompilierung wird eine spezialisierte Vorlage wie jede andere Klasse oder Methode aus.Im Gegensatz dazu wird Generika in MSIL als parametrisierter Typ ausgegeben, der von der Laufzeit bekannt ist, dass ein parametrisierter Typ sein. Quellcode, der auf eine Assembly verweist, die einen generischen Typ enthält, kann Spezialisierungen des generischen Typs erstellen.Weitere Informationen zu den Vergleich von Visual C++-Vorlagen und Generika finden Sie unter Generika und Vorlagen (Visual C++).
Generische Funktionen und Typen
Klassentypen, solange sie verwaltete Typen sind, können generisch.Ein Beispiel hierfür könnte eine List Klasse.Der Typ des Objekts in der Liste würde der Typparameter sein.Wenn Sie eine List Klasse für viele verschiedene Objekttypen erforderlich, bevor Sie List Generika verwendet, das System:: Objekt als Elementtyp akzeptiert.Das wäre jedes ermöglichen in der Liste zu verwendende Objekt (einschließlich Objekte des falschen Typs).Eine solche Liste kann eine nicht typisierte Auflistungsklasse aufgerufen.Bestenfalls können Sie den Typ zur Laufzeit zu überprüfen und eine Ausnahme auslösen.Oder Sie können eine Vorlage verwendet, die seine generischen Qualität verloren gehen würde, die einmal in eine Assembly kompiliert wurde.Consumer Ihrer Assembly nicht über eigene Spezialisierungen der Vorlage konnten nicht erstellt werden.Generika können Sie typisierte Auflistungsklassen zu erstellen, lautet List<int> (Lesen als „int“) und die Liste derList<double> „()“ Doubles Liste der einen Kompilierungsfehler generieren würden, wenn Sie versucht haben, einen Typ, der die Auflistung nicht entworfen wurde, um die typisierten Auflistung zu übernehmen.Darüber hinaus bleiben diese Typen generisch, nachdem sie kompiliert sind.
Eine Beschreibung der Syntax von generischen Klassen wird in Generische Klassen (C++/CLI)neuen Namespace.A, System.Collections.Generic, vorstellt einen Satz von parametrisierten Auflistungstypen einschließlich Dictionary<TKey, TValue>, List<T> und LinkedList<T>gefunden werden.Weitere Informationen finden Sie unter Generika in der .NET Framework-Klassenbibliothek (C#-Programmierhandbuch).
Möglicherweise sind Instanz und statische Klassenmember, Delegaten und globale Funktionen auch generisch.Generische Funktionen sind möglicherweise erforderlich, wenn die Parameter der Funktion über einen unbekannten Typ ist, oder wenn die Funktion selbst mit generischen Typen arbeiten müssen.In vielen Fällen, wo System:: Objekt möglicherweise in der Vergangenheit als Parameter für einen unbekannten Objekttyps verwendet, wird ein generischer Typparameter verwendet stattdessen möglicherweise und ermöglicht das typsichereren Code zu.Jeder Versuch, einen Typ zu übergeben, dass die Funktion nicht für entworfen wurde, wird als Fehler zur Kompilierzeit bezeichnet.Verwenden System:: Objekt als Funktionsparameter, würde das unbeabsichtigte Übergabe eines Objekts, dass die Funktion nicht beabsichtigt war, zu verarbeiten, und Sie müssen nicht den unbekannten würde zu einem bestimmten Objekttyp umwandeln, den Funktionsrumpf einzugeben und erläutert die Wahrscheinlichkeit von einem InvalidCastException erkannt.Mit einem generischen würde der Code versucht, ein Objekt an die Funktion zu übergeben, einen Typ Ressourcenkonflikte verursachen, sodass der Funktionsrumpf stellt sicher, um den richtigen Typ zu erhalten.
Die gleichen Vorteile gelten für die Auflistungsklassen, die auf Generika erstellt werden.Auflistungsklassen in der Vergangenheit wurden System:: Objekt verwenden, um Elemente in einer Auflistung zu speichern.Einfügen von Objekten eines Typs, dass die Auflistung nicht für entworfen wurde, wurde zur Kompilierzeit und häufig auch nicht gekennzeichnet, wenn die Objekte eingefügt wurden.Normalerweise würde ein Objekt in einen anderen Typ konvertiert, wenn sie in der Auflistung zugegriffen wurde.Nur als fehlgeschlagen Umwandlung der unerwarteten Typ erkannt wird.Generika zur Kompilierungszeit löst dieses Problem, indem Sie jedem Code erkennen, der einen Typ, der nicht Einfügen (oder implizit) zum Konvertieren der Typparameter der generischen Auflistung übereinstimmt.
Eine Beschreibung der Syntax, finden Sie Generische Funktionen (C++/CLI)weitere Informationen.
Terminologie, die mit Generika
Typparameter
Eine generische Deklaration enthält mindestens einen unbekannten Typ, der als Typparameterbezeichnet wird.Typparameter sind ein Name zugewiesen, der für den Typ im Text der generischen Deklaration wird.Der Typparameter wird als Typ innerhalb des Textkörpers der generischen Deklaration verwendet.Die generische Deklaration für die Liste <T> enthält den Typparameter T.
Typargumente
Das Typargument ist der tatsächliche Typ, der anstelle des Typparameters verwendet wird, wenn das generische für einen bestimmten Typ oder Typen spezialisiert ist.Beispielsweise ist int das Typargument in List<int>.Werttypen und Handle Typen sind die einzigen Typen, die als generisches Typargument zulässig sind.
Konstruierter Typ
Ein Typ, der von einem generischen Typ erstellt wird, so genannte ein konstruierter Typ.Ein Typ nicht vollständig angegeben, wie List<T> ist ein offener konstruierter Typ; ein vollständig angegebener Typ, z. B. List<double>, ist ein geschlossener konstruierter Typ oder ein spezialisierter Typ.Öffnen konstruierten Typen verwendet werden in der Definition anderer generischer Typen und Methoden oder nicht vollständig angegeben werden kann, bis ein generischer Typ selbst angegeben ist.Beispielsweise ist Folgendes Verwendung eines offenen konstruierten Typ als Basisklasse für ein generisches:
// generics_overview.cpp
// compile with: /clr /c
generic <typename T>
ref class List {};
generic <typename T>
ref class Queue : public List<T> {};
Einschränkung
Eine Einschränkung ist eine Einschränkung für Typen, die als Typparameter verwendet werden.Beispielsweise könnte eine angegebene generische Klasse nur Klassen übernehmen, die von einer bestimmten Klasse erben, oder eine bestimmte Schnittstelle implementieren.Weitere Informationen finden Sie unter Einschränkungen für generische Typparameter (C++/CLI).
Werttypen und Referenztypen
Behandeln von Typen und Werttypen werden als Typargumente verwendet werden.In der allgemeinen Definition in der jeder Typ möglicherweise verwendet wird, ist die Syntax von Verweistypen die.Beispielsweise wird der Operator verwendet, um - > Member des Typs des Typparameters zu verweisen, ob der schließlich verwendete Typ ein Verweistyp oder ein Werttyp ist.Wenn ein Werttyp als Typargument verwendet wird, generiert die Laufzeit Code, der die Werttypen verwendet, ohne direkt die Werttypen einzupacken.
Wenn Sie einen Referenztyp als generisches Typargument verwenden, verwenden Sie die Syntax zu behandeln.Wenn Sie einen Werttyp als generisches Typargument verwenden, verwenden Sie den Namen des Typs direkt.
// 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;
}
Typparameter
Typparameter einer generischen Klasse werden wie andere Bezeichner behandelt.Da jedoch der Typ nicht bekannt ist, gibt es Einschränkungen bezüglich ihrer Verwendung.Sie können beispielsweise Member und Methoden der Typparameter Klasse nicht verwenden, es sei denn, der Typparameter bezeichnet wird, um diese Member zu unterstützen.Das heißt, um einen Member durch den Typparameter zu verweisen, müssen Sie den Typ auf den Member hinzufügen, der Einschränkungsliste des Typparameters enthält.
// 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());
}
Diese Einschränkungen gelten auch Operatoren an.Ein zwangloser generischer Typparameter verwendet möglicherweise nicht die == und != Operatoren, um zwei Instanzen des Typparameters zu vergleichen, wenn der Typ nicht über diese Operatoren unterstützt.Diese Überprüfungen sind für Generika, jedoch nicht für Vorlagen notwendig, da Generika zur Laufzeit mit allen Klassen spezialisiert ist, die die Einschränkungen erfüllt, wenn sie zu spät ist für die Verwendung von ungültigen Member zu überprüfen.
Eine Standardinstanz des Typparameters wird erstellt werden, indem Sie den () Operator verwendet.Beispiele:
T t = T();
T wo ein Typparameter einer generischen Klasse oder Methodendefinition ist, initialisiert die Variable den Standardwert.Wenn T eine Verweisklasse ist, handelt es sich um einen NULL-Zeiger. T wenn eine Wertklasse ist, wird das Objekt auf Null initialisiert.Dadurch wird eine standardmäßige Initialisierungaufgerufen.