Delen via


Verschillen tussen C++-sjablonen en C# Generics (C#-programmeerhandleiding)

C# Generics en C++ sjablonen zijn beide taalfuncties die ondersteuning bieden voor geparameteriseerde typen. Er zijn echter veel verschillen tussen de twee. Op syntaxisniveau zijn C#-generics een eenvoudigere benadering van geparameteriseerde typen zonder de complexiteit van C++-sjablonen. Daarnaast probeert C# niet alle functionaliteit te bieden die C++-sjablonen bieden. Op implementatieniveau is het belangrijkste verschil dat C#-algemene typevervangingen worden uitgevoerd tijdens runtime en algemene typegegevens daardoor behouden blijven voor geïnstantieerde objecten. Zie Generics in runtime voor meer informatie.

Hier volgen de belangrijkste verschillen tussen C# Generics en C++-sjablonen:

  • C#-generics bieden niet dezelfde mate van flexibiliteit als C++-sjablonen. Het is bijvoorbeeld niet mogelijk om rekenkundige operators aan te roepen in een algemene C#-klasse, hoewel het mogelijk is om door de gebruiker gedefinieerde operators aan te roepen.

  • C# staat geen sjabloonparameters toe die niet van het type zijn, zoals template C<int i> {}.

  • C# biedt geen ondersteuning voor expliciete specialisatie; Dat wil gezegd: een aangepaste implementatie van een sjabloon voor een specifiek type.

  • C# biedt geen ondersteuning voor gedeeltelijke specialisatie: een aangepaste implementatie voor een subset van de typeargumenten.

  • C# staat niet toe dat de typeparameter wordt gebruikt als basisklasse voor het algemene type.

  • C# staat niet toe dat typeparameters standaardtypen hebben.

  • In C# kan een algemene typeparameter niet zelf een algemeen type zijn, hoewel samengestelde typen kunnen worden gebruikt als generics. C++ staat sjabloonparameters toe.

  • C++ staat code toe die mogelijk niet geldig is voor alle typeparameters in de sjabloon, die vervolgens wordt gecontroleerd op het specifieke type dat wordt gebruikt als de typeparameter. C# vereist dat code in een klasse zodanig wordt geschreven dat deze werkt met elk type dat voldoet aan de beperkingen. In C++ is het bijvoorbeeld mogelijk om een functie te schrijven die gebruikmaakt van de rekenkundige operatoren + en - op objecten van de typeparameter, die een fout veroorzaakt op het moment van instantiëring van de sjabloon met een type dat deze operators niet ondersteunt. C# staat dit niet toe; de enige toegestane taalconstructies zijn die kunnen worden afgeleid van de beperkingen.

Zie ook