Compartilhar via


Diferenças entre modelos C++ e genéricos em C# (Guia de Programação em C#)

Os modelos C# Generics e C++ são recursos de linguagem que dão suporte a tipos parametrizados. No entanto, há muitas diferenças entre os dois. No nível da sintaxe, os genéricos C# são uma abordagem mais simples para tipos parametrizados sem a complexidade dos modelos C++. Além disso, o C# não tenta fornecer todas as funcionalidades que os modelos C++ fornecem. No nível de implementação, a principal diferença é que as substituições de tipo genérico C# são executadas em tempo de execução e as informações de tipo genérico são preservadas para objetos instanciados. Para obter mais informações, consulte Genéricos no Runtime.

Veja a seguir as principais diferenças entre os modelos C# Generics e C++:

  • Os genéricos de C# não fornecem a mesma flexibilidade que os modelos C++. Por exemplo, não é possível chamar operadores aritméticos em uma classe genérica C#, embora seja possível chamar operadores definidos pelo usuário.

  • O C# não permite parâmetros de modelo sem tipo, como template C<int i> {}.

  • O C# não dá suporte à especialização explícita; ou seja, uma implementação personalizada de um modelo para um tipo específico.

  • O C# não dá suporte à especialização parcial: uma implementação personalizada para um subconjunto dos argumentos de tipo.

  • O C# não permite que o parâmetro de tipo seja usado como a classe base para o tipo genérico.

  • O C# não permite que parâmetros de tipo tenham tipos padrão.

  • No C#, um parâmetro de tipo genérico não pode ser genérico, embora os tipos construídos possam ser usados como genéricos. O C++ permite parâmetros de modelo.

  • O C++ permite código que pode não ser válido para todos os parâmetros de tipo no modelo, que é então verificado para o tipo específico usado como o parâmetro de tipo. O C# requer que o código em uma classe seja escrito de forma que funcione com qualquer tipo que atenda às restrições. Por exemplo, no C++ é possível escrever uma função que usa os operadores aritméticos + e - objetos do parâmetro de tipo, o que produzirá um erro no momento da instanciação do modelo com um tipo que não dá suporte a esses operadores. O C# não permite isso; os únicos constructos de idioma permitidos são aqueles que podem ser deduzidos das restrições.

Consulte também