Поделиться через


Различия между шаблонами C++ и универсальными шаблонами C# (руководство по программированию на 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# запрещает это; Единственными допустимыми конструкциями языка являются те, которые могут быть выведены из ограничений.

См. также