В C# предусмотрено 16 встроенных предопределённых типов, разделяющихся на 13 простых типов и 3 непростых типа. Все имена предопределённых типов пишутся строчными буквами.
graph TD
A[Предопределённые типы] --> B[Простые]
A --> C[object]
A --> D[string]
A --> E[dynamic]
B --> F[Числовые]
B --> G[Нечисловые]
F --> H[bool]
F --> I[char]
G --> J[Целые]
G --> K[С плавающей точкой]
J --> L[8-битные]
J --> M[16-битные]
J --> N[32-битные]
J --> O[64-битные]
L --> P[sbyte]
L --> Q[byte]
M --> R[short]
M --> S[ushort]
N --> T[int]
N --> U[uint]
O --> V[long]
O --> W[ulong]
K --> X[decimal]
K --> Y[float]
K --> Z[double]
%% Листовые узлы окрасить в зелёный
style H fill:#90ee90
style I fill:#90ee90
style P fill:#90ee90
style Q fill:#90ee90
style R fill:#90ee90
style S fill:#90ee90
style T fill:#90ee90
style U fill:#90ee90
style V fill:#90ee90
style W fill:#90ee90
style X fill:#90ee90
style Y fill:#90ee90
style Z fill:#90ee90
style C fill:#90ee90
style D fill:#90ee90
style E fill:#90ee9013 простых типов
- Числовые типы (всего 11): 8 целочисленных вариантов
sbyte/byte, short/ushort, int/uint, long/ulong; 3 варианта с плавающей точкойfloat, double, decimal(decimal предназначен для высокоточных расчётов денежных сумм) - Нечисловые типы (всего 2):
char(один символ Unicode),bool(только значения true или false)
Особенность: в отличие от C/C++, числовые значения в C# нельзя использовать напрямую как условие булева сравнения.
3 непростых ссылочных типа
string (последовательность символов), object (базовый класс для всех типов), dynamic (для взаимодействия с динамическими языками)
Типы C# и типы .NET
Каждый встроенный предопределённый тип напрямую сопоставляется с базовым типом .NET. Ключевые слова типов C# — это всего лишь псевдонимы соответствующих типов .NET. Код скомпилируется корректно, если использовать полные имена классов .NET, но официальные рекомендации по стилю кода не советуют такой подход. При написании кода на C# предпочитайте встроенные ключевые слова C#, а не полные имена классов .NET.
Предопределённые простые типы
| Ключевое слово C# | Описание | Диапазон значений | Базовый тип .NET | Значение по умолчанию |
|---|---|---|---|---|
| sbyte | 8-битное знаковое целое | -128 ~ 127 | System.SByte | 0 |
| byte | 8-битное беззнаковое целое | 0 ~ 255 | System.Byte | 0 |
| short | 16-битное знаковое целое | -32768 ~ 32767 | System.Int16 | 0 |
| ushort | 16-битное беззнаковое целое | 0 ~ 65535 | System.UInt16 | 0 |
| int | 32-битное знаковое целое | -2147483648 ~ 2147483647 | System.Int32 | 0 |
| uint | 32-битное беззнаковое целое | 0 ~ 4294967295 | System.UInt32 | 0 |
| long | 64-битное знаковое целое | -9223372036854775808 ~ 9223372036854775807 | System.Int64 | 0 |
| ulong | 64-битное беззнаковое целое | 0 ~ 18446744073709551615 | System.UInt64 | 0 |
| float | Число с одинарной точностью | 1,5×10⁻⁴⁵ ~ 3,4×10³⁸ | System.Single | 0.0f |
| double | Число с двойной точностью | 5×10⁻³²⁴ ~ 1,7×10³⁰⁸ | System.Double | 0.0d |
| bool | Логический тип | true / false | System.Boolean | false |
| char | Символ Unicode | U+0000 ~ U+FFFF | System.Char | \x0000 (нулевой символ) |
| decimal | Высокоточный десятичный тип (28 значащих цифр) | ±1,0×10⁻²⁸ ~ ±7,9×10²⁸ | System.Decimal | 0m |
Предопределённые непростые типы
| Ключевое слово C# | Описание | Базовый тип .NET |
|---|---|---|
| object | Базовый класс для всех типов, включая простые типы значений | System.Object |
| string | Строка из нуля или нескольких символов Unicode | System.String |
| dynamic | Динамический тип для совместимости со сборками динамических языков | Фиксированного соответствующего типа .NET нет |
int полностью эквивалентно System.Int32, а string — System.String; компилятор автоматически распознаёт и преобразует их друг в друга.
Стандарты кодирования настоятельно рекомендуют использовать ключевые слова C# (пишите int, а не Int32) для улучшения читаемости кода.
Простые типы также называются типами значений (Value Type).
Они хранят одно единственное значение и размещаются в стеке памяти;
Если переменная объявлена без явного присваивания, ей автоматически присваивается значение по умолчанию, указанное в таблице;
Все простые типы наследуются напрямую от object и поддерживают операции упаковки и распаковки (рассмотрим далее).
Серия целочисленных типов
- Типы с префиксом
u(uint/ushort/ulong/byte) — беззнаковые, хранят только неотрицательные числа; - sbyte/short/int/long — знаковые, поддерживают как положительные, так и отрицательные целые.
Серия типов с плавающей точкой
float: одинарная точность, суффиксf. Низкая точность, быстрые вычисления; подходит для графики и 3D-визуализации;double: двойная точность, суффиксd. Тип по умолчанию для литералов с плавающей точкой, универсален для научных расчётов;decimal: высокоточный десятичный тип, суффиксm. Разработан для финансовых и валютных расчётов, не имеет погрешностей плавающей точки.
Логический и символьный типы
bool: только два возможных значения, не допускается неявное преобразование между логическим и числовым типом;char: хранит один символ Unicode, внутренне представляется как 16-битное беззнаковое целое число.
Непростые типы (ссылочные типы Reference Type)
- object: корневой базовый тип. Все типы значений и ссылки наследуются от него, является основой механизма упаковки;
- string: особый ссылочный тип, строки неизменяемы, пустая строка
""является допустимым экземпляром по умолчанию; - dynamic: проверка типов не выполняется на этапе компиляции, члены разрешаются во время выполнения. Не имеет фиксированного соответствия в .NET, используется для интеграции с динамическими языками Python/Ruby; жертвует безопасностью компиляции ради гибкости.
static void Main(string[] args)
{
// 1. 8-битные целые
sbyte sByteNum = -60;
byte byteNum = 200;
// 2. 16-битные целые
short shortNum = -12000;
ushort uShortNum = 50000;
// 3. 32-битные целые
int intNum = -888888;
uint uIntNum = 3000000000U;
// 4. 64-битные целые
long longNum = -7000000000000L;
ulong uLongNum = 12000000000000000UL;
// 5. Типы с плавающей точкой
float floatNum = 3.14f;
double doubleNum = 2.71828;
decimal decMoney = 999.99m;
// 6. Логический тип
bool flag = true;
// 7. Символ Unicode
char ch = 'A';
// 8. Предопределённые непростые типы
object obj = 123;
string str = "FOXDEVELOP.COM";
dynamic dy = "jack";
}Code language: JavaScript (javascript)
Встроенные типы