uint | 32-битовое целое число без знака | U |
long | 64-битовое целое число со знаком | L |
ulong | 64-битовое целое число без знака | UL |
float | 32-битовое значение с плавающей точкой со знаком | F |
double | 64-битовое значение с плавающей точкой со знаком | D |
bool | true или false | |
char | 16-битовый символ Unicode | '' |
decimal | Число с плавающей точкой с 28 значащими цифрами | M |
string | Множество символов Unicode переменной длины | '' |
object | Используется там, где не определен тип данных. Ближайшим эквивалентом в C++ является void* , за исключением того, что object не является указателем. |
В приведенной выше таблице символ в третьем столбце указывает букву, которая может быть помещена после числа, чтобы указать его тип явно, например, 28UL
означает число 28, хранимое как long
без знака. Как и в случае C++, одиночные кавычки используются для обозначения символов, двойные кавычки для строк. Однако в C# символы всегда являются символами Unicode, а строки являются определенным ссылочным типом, а не просто массивом символов.
Типы данных в C# используются более аккуратно, чем в C++. Например, в C++ обычно ожидается, что int
будет занимать 2 байта (16 битов), но определение ANSI C++ разрешает, чтобы это зависело от платформы. Следовательно, в Windows int
в C++ занимает 4 байта, столько же сколько и long
. Это очевидно вызывает достаточно много проблем совместимости при переносе программ C++ между платформами. С другой стороны, в C# каждый предопределенный тип данных (за исключением string
и object
) имеет явное определение занимаемой памяти.
Так как размер каждого из примитивных типов (примитивным типом является любой из приведенных выше, за исключением string
и object
) фиксирован в C#, то существует меньшая потребность в операторе sizeof
, хотя он и есть в C#, но допустим только в ненадежном коде (как будет описано позже).
Несмотря на то, что многие имена в C# аналогичны именам C++ и существует достаточно интуитивно понятное отображение между многими из соответствующих типов, некоторые вещи отличаются синтаксически. В частности, signed
и unsigned
не являются ключевыми словами в C# (в C++ можно использовать эти ключевые слова, также как long
и short
для модификации других типов данных (например, unsigned long
, short int
). Такие модификации недопустимы в C#, поэтому приведенная выше таблица является фактически полным списком предопределенных типов данных.
Базовые типы данных как объекты
В отличие от C++ (но как в Java) базовые типы данных в C# трактуются как объекты, чтобы вызывать на них некоторые методы. Например, в C# возможно преобразование целого числа в строку следующим образом.
int I = 10;
string Y = I.ToString();
Можно даже написать:
string Y = 10.ToString();
Тот факт, что базовые типы данных рассматриваются как объекты, показывает тесную связь между C# и библиотекой базовых классов .NET. C# компилирует базовые типы данных, отображая каждый из них в один из базовых классов, например, string
отображается в System.String
, int
в System.Int32
и т.д. Поэтому на самом деле в C# все является объектом. Однако отметим, что это применимо только для синтаксических целей. В реальности при выполнении кода эти типы реализуются как описанные ниже типы промежуточного языка, поэтому нет потери производительности, связанной с интерпретацией базовых типов как объектов. Здесь не будут перечисляться все методы, доступные для базовых типов данных, так как подробности представлены в MSDN. Однако необходимо отметить следующие особенности:
□ Все типы имеют метод ToString()
. Для базовых типов данных он возвращает строковое представление их значения.
□ char
содержит большое число свойств, которые предоставляют