Различия между шаблонами языка C++ и универсальными шаблонами языка C# (руководство по программированию в C#)

Обновлен: Ноябрь 2007

Универсальные шаблоны языка C# и шаблоны языка C++ являются функциями языков программирования, обеспечивающими поддержку параметризированных типов. Но между ними существует много различий. На уровне синтаксиса универсальные шаблоны языка C# являются более простым подходом к параметризованным типам, исключающим сложность шаблонов языка C++. Кроме того, в языке C# не делается попытки обеспечить все функциональные возможности, обеспечиваемые шаблонами языка C++. На уровне реализации основное отличие заключается в том, что замена универсальных типов языка C# выполняется во время выполнения и информация универсальных типов, таким образом, сохраняется для экземпляров объектов. Дополнительные сведения см. в разделе Универсальные типы во время выполнения (руководство по программированию в C#).

Ниже приведены основные различия между шаблонами языка C++ и универсальными шаблонами языка C#:

  • Универсальные шаблоны языка C# не обеспечивают такую же гибкость, как шаблоны языка C++. Например, невозможно вызвать арифметические операторы в универсальном классе языка C#, хотя можно вызвать операторы, определенные пользователем.

  • Язык C# не позволяет использовать не являющиеся типами параметры шаблона, например template C<int i> {}.

  • Язык C# не поддерживает явную специализацию, т.е. индивидуальную реализацию шаблона для конкретного типа.

  • Язык C# не поддерживает частичную специализацию: индивидуальную реализацию для подмножества аргументов типа.

  • Язык C# не позволяет использовать параметр типа в качестве базового класса для универсального типа.

  • Язык C# не позволяет параметрам типов иметь типы по умолчанию.

  • В языке C# параметр универсального типа не может сам быть универсального типа, хотя сконструированные типы могут использоваться как универсальные. Язык C++ не допускает использование параметров шаблона.

  • Язык C++ позволяет использование кода, который может быть допустимым не для всех параметров типа в шаблоне и который затем проверяется для конкретного типа, используемого в качестве параметра типа. В языке C# код класса должен быть написан таким образом, чтобы он работал с любым типом, удовлетворяющим требования существующих ограничений. Например, в языке C++ можно написать функцию, которая использует арифметические операторы + и - применительно к объектам параметра типа, что приведет к ошибке во время создания экземпляра шаблона с типом, который не поддерживает эти операторы. Язык C# не позволяет это делать. Допускаются только те языковые конструкции, которые могут быть выведены из ограничений.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Введение в универсальные шаблоны. (Руководство по программированию на C#)

Другие ресурсы

Templates