Partilhar via


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

Os modelos C# Generics e C++ são recursos de linguagem que fornecem suporte para tipos parametrizados. No entanto, existem muitas diferenças entre os dois. No nível de 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, portanto, as informações de tipo genérico são preservadas para objetos instanciados. Para obter mais informações, consulte Genéricos no tempo de execução.

A seguir estão as principais diferenças entre os modelos C# Generics e C++:

  • Os genéricos C# não fornecem a mesma quantidade de 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.

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

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

  • C# não suporta especialização parcial: uma implementação personalizada para um subconjunto dos argumentos de tipo.

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

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

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

  • 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 type. C# requer que o código em uma classe seja escrito de tal forma que ele funcione com qualquer tipo que satisfaça as restrições. Por exemplo, em C++ é possível escrever uma função que usa os operadores + aritméticos e - em objetos do parâmetro type, o que produzirá um erro no momento da instanciação do modelo com um tipo que não suporta esses operadores. C# não permite isso; As únicas construções de linguagem permitidas são aquelas que podem ser deduzidas das restrições.

Consulte também