Compartir a través de


Diferencias entre las plantillas de C++ y los genéricos de C# (Guía de programación de C#)

Las plantillas genéricas de C# y C++ son características de lenguaje que proporcionan compatibilidad con tipos con parámetros. Sin embargo, hay muchas diferencias entre los dos. En el nivel de sintaxis, los genéricos de C# son un enfoque más sencillo para los tipos con parámetros sin la complejidad de las plantillas de C++. Además, C# no intenta proporcionar toda la funcionalidad que proporcionan las plantillas de C++. En el nivel de implementación, la diferencia principal es que las sustituciones de tipos genéricos de C# se realizan en tiempo de ejecución y, por tanto, se conserva la información de tipo genérico para los objetos creados en instancias. Para obtener más información, vea Genéricos en tiempo de ejecución.

A continuación se muestran las principales diferencias entre las plantillas genéricas de C# y C++:

  • Los genéricos de C# no proporcionan la misma flexibilidad que las plantillas de C++. Por ejemplo, no es posible llamar a operadores aritméticos en una clase genérica de C#, aunque es posible llamar a operadores definidos por el usuario.

  • C# no permite parámetros de plantilla que no sean de tipo, como template C<int i> {}.

  • C# no admite la especialización explícita; es decir, una implementación personalizada de una plantilla para un tipo específico.

  • C# no admite la especialización parcial: una implementación personalizada para un subconjunto de los argumentos de tipo.

  • C# no permite usar el parámetro de tipo como clase base para el tipo genérico.

  • C# no permite que los parámetros de tipo tengan tipos predeterminados.

  • En C#, un parámetro de tipo genérico no puede ser genérico, aunque los tipos construidos se pueden usar como genéricos. C++ permite parámetros de plantilla.

  • C++ permite el código que podría no ser válido para todos los parámetros de tipo de la plantilla, que a continuación se comprueba para el tipo específico que se usa como parámetro de tipo. C# requiere que el código de una clase se escriba de forma que funcione con cualquier tipo que satisfaga las restricciones. Por ejemplo, en C++ es posible escribir una función que use los operadores aritméticos + y - en objetos del parámetro de tipo, lo que producirá un error en el momento de la creación de instancias de la plantilla con un tipo que no admite estos operadores. C# no permite esto; las únicas construcciones de lenguaje permitidas son las que se pueden deducir de las restricciones.

Consulte también