Diferenças entre modelos C++ e genéricos C# (Guia de Programação em C#)Differences Between C++ Templates and C# Generics (C# Programming Guide)

Os modelos C++ e genéricos C# são recursos de linguagem que fornecem o suporte aos tipos parametrizados.C# Generics and C++ templates are both language features that provide support for parameterized types. No entanto, há várias diferenças entre os dois.However, there are many differences between the two. No nível de sintaxe, os genéricos C# são uma abordagem mais simples para os tipos parametrizados sem a complexidade de modelos C++.At the syntax level, C# generics are a simpler approach to parameterized types without the complexity of C++ templates. Além disso, o C# não tenta fornecer toda a funcionalidade que os modelos C++ fornecem.In addition, C# does not attempt to provide all of the functionality that C++ templates provide. No nível da implementação, a principal diferença é que as substituições do tipo genérico do C# são realizadas em tempo de execução e as informações do tipo genérico são preservadas para objetos instanciados.At the implementation level, the primary difference is that C# generic type substitutions are performed at runtime and generic type information is thereby preserved for instantiated objects. Para obter mais informações, consulte Genéricos em tempo de execução.For more information, see Generics in the Run Time.

A seguir estão as principais diferenças entre modelos C++ e genéricos C#:The following are the key differences between C# Generics and C++ templates:

  • Os genéricos C# não oferecem a mesma flexibilidade que os modelos C++.C# generics do not provide the same amount of flexibility as C++ templates. Por exemplo, não é possível chamar os operadores aritméticos em uma classe genérica C#, embora seja possível chamar operadores definidos pelo usuário.For example, it is not possible to call arithmetic operators in a C# generic class, although it is possible to call user defined operators.

  • O C# não permite parâmetros de modelo sem tipo, como template C<int i> {}.C# does not allow non-type template parameters, such as 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.C# does not support explicit specialization; that is, a custom implementation of a template for a specific type.

  • O C# não dá suporte à especialização parcial: uma implementação personalizada para um subconjunto dos argumentos de tipo.C# does not support partial specialization: a custom implementation for a subset of the type arguments.

  • O C# não permite que o parâmetro de tipo a ser usado como a classe base para o tipo genérico.C# does not allow the type parameter to be used as the base class for the generic type.

  • O C# não permite que os parâmetros de tipo tenham tipos padrão.C# does not allow type parameters to have default types.

  • 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.In C#, a generic type parameter cannot itself be a generic, although constructed types can be used as generics. O C++ permite parâmetros de modelo.C++ does allow template parameters.

  • O C++ permite o 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.C++ allows code that might not be valid for all type parameters in the template, which is then checked for the specific type used as the type parameter. O C# requer código em uma classe a ser gravada de forma que ele funcionará com qualquer tipo que satisfaça as restrições.C# requires code in a class to be written in such a way that it will work with any type that satisfies the constraints. Por exemplo, em C++ é possível escrever uma função que usa os operadores aritméticos + e - em objetos do parâmetro de tipo, que produzirá um erro no momento da instanciação do modelo com um tipo que não dá suporte a esses operadores.For example, in C++ it is possible to write a function that uses the arithmetic operators + and - on objects of the type parameter, which will produce an error at the time of instantiation of the template with a type that does not support these operators. O C# não permite isso. Os únicos constructos da linguagem permitidos são os que podem ser deduzidos das restrições.C# disallows this; the only language constructs allowed are those that can be deduced from the constraints.

Consulte tambémSee Also