Встроенные типы

В 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:#90ee90

13 простых типов

  • Числовые типы (всего 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Значение по умолчанию
sbyte8-битное знаковое целое-128 ~ 127System.SByte0
byte8-битное беззнаковое целое0 ~ 255System.Byte0
short16-битное знаковое целое-32768 ~ 32767System.Int160
ushort16-битное беззнаковое целое0 ~ 65535System.UInt160
int32-битное знаковое целое-2147483648 ~ 2147483647System.Int320
uint32-битное беззнаковое целое0 ~ 4294967295System.UInt320
long64-битное знаковое целое-9223372036854775808 ~ 9223372036854775807System.Int640
ulong64-битное беззнаковое целое0 ~ 18446744073709551615System.UInt640
floatЧисло с одинарной точностью1,5×10⁻⁴⁵ ~ 3,4×10³⁸System.Single0.0f
doubleЧисло с двойной точностью5×10⁻³²⁴ ~ 1,7×10³⁰⁸System.Double0.0d
boolЛогический типtrue / falseSystem.Booleanfalse
charСимвол UnicodeU+0000 ~ U+FFFFSystem.Char\x0000 (нулевой символ)
decimalВысокоточный десятичный тип (28 значащих цифр)±1,0×10⁻²⁸ ~ ±7,9×10²⁸System.Decimal0m

Предопределённые непростые типы

Ключевое слово C#ОписаниеБазовый тип .NET
objectБазовый класс для всех типов, включая простые типы значенийSystem.Object
stringСтрока из нуля или нескольких символов UnicodeSystem.String
dynamicДинамический тип для совместимости со сборками динамических языковФиксированного соответствующего типа .NET нет

int полностью эквивалентно System.Int32, а stringSystem.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)

  1. object: корневой базовый тип. Все типы значений и ссылки наследуются от него, является основой механизма упаковки;
  2. string: особый ссылочный тип, строки неизменяемы, пустая строка "" является допустимым экземпляром по умолчанию;
  3. 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)

Встроенные типы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *