Unterschiede zwischen C++-Vorlagen und C#-Generika (C#-Programmierhandbuch)Differences Between C++ Templates and C# Generics (C# Programming Guide)

C#-Generika und C++-Vorlagen sind Sprachfunktionen, die Unterstützung für parametrisierte Typen ermöglichen.C# Generics and C++ templates are both language features that provide support for parameterized types. Es gibt jedoch viele Unterschiede zwischen den beiden.However, there are many differences between the two. Auf der Syntaxebene sind C#-Generika ein einfacherer Ansatz für parametrisierte Typen ohne die Komplexität von C++-Vorlagen.At the syntax level, C# generics are a simpler approach to parameterized types without the complexity of C++ templates. Darüber hinaus versucht C# nicht alle Funktionen bereitzustellen, die C++-Vorlagen bereitstellen.In addition, C# does not attempt to provide all of the functionality that C++ templates provide. Auf der Ebene der Implementierung ist der wichtigste Unterschied, dass C#-Ersetzungen des generischen Typs zur Laufzeit durchgeführt werden und allgemeine Informationen für die instanziierten Objekte beibehalten werden.At the implementation level, the primary difference is that C# generic type substitutions are performed at runtime and generic type information is thereby preserved for instantiated objects. Weitere Informationen finden Sie unter Generika zur Laufzeit.For more information, see Generics in the Run Time.

Die folgenden sind die Hauptunterschiede zwischen C#-Generika und C++-Vorlagen:The following are the key differences between C# Generics and C++ templates:

  • C#-Generika bieten nicht die gleiche Menge an Flexibilität wie C++-Vorlagen.C# generics do not provide the same amount of flexibility as C++ templates. Es ist z.B. nicht möglich, arithmetische Operatoren in einer generischen Klasse von C# aufzurufen, obwohl es möglich ist, benutzerdefinierte Operatoren aufzurufen.For example, it is not possible to call arithmetic operators in a C# generic class, although it is possible to call user defined operators.

  • C# lässt keine Nichttyp-Vorlagenparameter zu, wie z.B. template C<int i> {}.C# does not allow non-type template parameters, such as template C<int i> {}.

  • C# unterstützt keine explizite Spezialisierung; d.h. eine benutzerdefinierte Implementierung einer Vorlage für einen bestimmten Typ.C# does not support explicit specialization; that is, a custom implementation of a template for a specific type.

  • C# unterstützt keine partielle Spezialisierung: Eine benutzerdefinierte Implementierung für eine Teilmenge der Typargumente.C# does not support partial specialization: a custom implementation for a subset of the type arguments.

  • C# lässt nicht zu, dass der Typparameter als Basisklasse für den generischen Typ verwendet wird.C# does not allow the type parameter to be used as the base class for the generic type.

  • C# lässt nicht zu, dass Typparameter über Standardtypen verfügen.C# does not allow type parameters to have default types.

  • In C# kann kein generischer Typparameter selbst generisch sein, obwohl konstruierte Typen als Generika verwendet werden können.In C#, a generic type parameter cannot itself be a generic, although constructed types can be used as generics. C++ lässt Vorlagenparameter zu.C++ does allow template parameters.

  • C++ lässt Code zu, der möglicherweise nicht für alle Typparameter in der Vorlage gültig ist, die anschließend auf den spezifischen Typ, der als Typparameter verwendet wird, geprüft wird.C++ allows code that might not be valid for all type parameters in the template, which is then checked for the specific type used as the type parameter. In C# muss Code in einer Klasse in einer Weise geschrieben werden, dass er mit einem beliebigen Typ arbeiten kann, der die Einschränkungen erfüllt.C# requires code in a class to be written in such a way that it will work with any type that satisfies the constraints. Zum Beispiel kann in C++ eine Funktion geschrieben werden, die die arithmetischen Operatoren + und - für Objekte des Typparameters verwendet, was einen Fehler bei der Instanziierung der Vorlage mit einem Typ, der diese Operatoren nicht unterstützt, erzeugt.For example, in C++ it is possible to write a function that uses the arithmetic operators + and - on objects of the type parameter, which will produce an error at the time of instantiation of the template with a type that does not support these operators. C# lässt dies zu; die einzigen zulässigen Sprachkonstrukte sind die, die von den Einschränkungen abgeleitet werden können.C# disallows this; the only language constructs allowed are those that can be deduced from the constraints.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Einführung in GenerikaIntroduction to Generics
VorlagenTemplates