Стандарт языка C++ включает следующий набор фундаментальных типов.
- Логический тип (bool).
- Символьный тип (char).
- Целые типы. Они могут отличаться размером: short, int, long, а также могут быть знаковыми (signed) или беззнаковыми (unsigned).
- Типы с плавающей точкой. Они также могут отличаться размерами: float, double и long double.
Тип void указывает на отсутствие информации.
К конструируемым типам относятся следующие:
- Указатели (например, char*).
- Ссылки (например, char&).
- Массивы (например, char[]).
Также язык позволяет разработчику конструировать собственные типы:
- Перечислимые типы (enum).
- Структуры (struct).
- Классы.
В языке C# все типы можно рассматривать и под другим ракурсом, разделив их на четыре категории:
- Типы-значения (value).
- Ссылочные (reference).
- Указатели (pointer).
- Тип void.
Для ссылочного типа значение задает ссылку на область памяти в "куче" (heap), где расположен соответствующий объект. Для типа-значения значением являются собственно данные, а память для них выделяется в стеке.
Логический, арифметический, структуры, перечисление относятся типам-значениям. Массивы, строки и классы относятся к ссылочным типам.
И ссылочные, и обычные типы являются производными от базового класса object. В тех случаях, когда обычный тип должен вести себя как объект, создается оболочка (wrapper), которую можно рассматривать как ссылочный объект, помещенный в кучу, и в нее копируется значение переменной обычного типа. Оболочка автоматически помечается таким образом, что система знает, какое значение она содержит. Этот процесс назывется упаковкой (boxing), а обратный процесс - распаковкой (unboxing).
Упаковка происходит автоматически, для этого нужно только присвоить значение обычного типа переменной типа object. Упаковка и распаковка позволяют обрабатывать любой тип как объект. Например, в выражении
7.ToString();
целое число 7 упаковывается путем вызова функции Int32.ToString().
Массивы в C# могут быть многомерными (multidimensional) или невыровненными (jagged). Более сложные структуры данных такие, как стек и хеш-таблица определены в пространстве имен System.Collections.