Dela via


Skillnader mellan C++-mallar och C#-generiska objekt (C#-programmeringsguide)

C# Generics- och C++-mallar är båda språkfunktioner som ger stöd för parametriserade typer. Det finns dock många skillnader mellan de två. På syntaxnivå är C#-generiska objekt en enklare metod för parametriserade typer utan komplexiteten i C++-mallar. Dessutom försöker C# inte tillhandahålla alla funktioner som C++-mallar tillhandahåller. På implementeringsnivå är den primära skillnaden att generiska typutbyten i C# utförs vid körningstid och generisk typinformation bevaras därmed för instansierade objekt. För mer information, se Generiska typer i körmiljö.

Följande är de viktigaste skillnaderna mellan C#Generics och C++-mallar:

  • C#-generika ger inte samma flexibilitet som C++-mallar. Det går till exempel inte att anropa aritmetiska operatorer i en allmän C#-klass, även om det är möjligt att anropa användardefinierade operatorer.

  • C# tillåter inte mallparametrar som inte är av typen , till exempel template C<int i> {}.

  • C# stöder inte explicit specialisering. en anpassad implementering av en mall för en viss typ.

  • C# stöder inte partiell specialisering: en anpassad implementering för en delmängd av typargumenten.

  • C# tillåter inte att typparametern används som basklass för den generiska typen.

  • C# tillåter inte att typparametrar har standardtyper.

  • I C# kan en generisk typparameter inte vara en allmän parameter, även om konstruerade typer kan användas som generiska objekt. C++ tillåter mallparametrar.

  • C++ tillåter kod som kanske inte är giltig för alla typparametrar i mallen, som sedan kontrolleras för den specifika typ som används som typparameter. C# kräver att kod i en klass skrivs på ett sådant sätt att den fungerar med alla typer som uppfyller begränsningarna. I C++ är det till exempel möjligt att skriva en funktion som använder de aritmetiska operatorerna + och - på objekt av typen parameter, vilket ger ett fel vid tidpunkten för instansiering av mallen med en typ som inte stöder dessa operatorer. C# tillåter inte detta; de enda språkkonstruktioner som tillåts är de som kan härledas från begränsningarna.

Se även