В основании больших и отказоустойчивых программ находится система типов, которая позволяет снизить риск ошибок и выражать наши мысли в коде более точно. В примитивном смысле мы можем говорить о типизации, как о наличие в языке некоего осмысления того, что каждое значение так или иначе имеет некие ограничения и допустимые операции.
В целом, почти все языки, о которых вы знаете, используют одну систему, так называемую “формальную систему типов”. Разнятся в языках только некоторые подходы и детали. Нельзя опускаться в священную войну и пытаться сравнивать это всё в формате “лучше или хуже”. Каждое решение ведёт к своим последствиям при разработке программы.
Если мы рассматриваем некоторые данные, например строку “Привет”, то эти данные связаны с каким-то типом. Для компьютера эта связь не имеет смысла, для него всё представляется нулями и единицами. Эта связь имеет смысл для нас и для некоторых инструментов, которыми мы пользуемся. В случае со строкой “Привет” мы можем оперировать типом “string”, он говорит что перед нами строка состоящая из символов и что символы в формате Unicode (2 байта на символ). Далее мы можем попробовать совершить такие действия:
“Привет” * 2;
О да, мы описали выражение, в котором пытаемся умножить строку на два. Какой результат у этой операции? На самом деле нельзя сказать. Нет никакой общепринятой аксиомы, как в случае с числами. Технически мы можем описать такую операцию и сказать, что произведение строки и числа даёт новую строку, в которой каждая буква исходной повторяется на основе множителя. А можно придумать другую операцию.
Если такая операция не описана в рамках нашей программы, то она считается ошибочной. О чём нас предупредит наша среда разработки. Каждое выражение также имеет определённый тип, при этом итоговый тип не всегда тот же, что и тип операндов. Главное запомнить, что каждое значение, которое мы рассматриваем, имеет некий тип, с которым мы должны считаться.
В C# есть набор примитивных типов, которые мы можем использовать. Также есть различные пользовательские типы, которые мы можем брать как со стандартной библиотеки, так и описывать самостоятельно. При разговоре про примитивные типы нельзя опускать такой термин как литерал. Литерал – это прямое представление значения определённого типа. У каждого типа свой формат записи литералов.
Так для целочисленного типа мы записываем просто число. А значение строкового типа описываем в двойных кавычках.
Индентификатор | Литерал | Детали |
byte, short, ushort, int, uint, long, ulong | Просто число. Пример: 1, 5, 25, -34, 0. Минус нуля в C# нет; | Целочисленные типы различаются по размеру (8, 16, 32 и 64 бита на число) и доступности отрицательных значений. |
bool | true или false; | Логический тип который удобен при работе с логическими операциями. Ограничен двумя значениями но при этом ему нужно 8 бит для их представления. |
char | Символ в одинарных кавычках. Пример: ‘a’, ‘b’, ‘1’ ; | Занимает 16 бит, и представляет символ из таблицы Unicode. Стоит понимать что символ ‘1’ и число 1 – это разные вещи. |
string | Некий набор символов (char) который образует строку. Символы все вместе находятся под двойным кавычками. Пример: “Hello”, “12”; | |
float, double | Для double просто число с дробной частью через точку. Для float тоже самое, но с припиской f. Пример: 12.0, 12.4, 14.2f; | Необходим для представления нецелых чисел. |