В любом современном языке программирования существуют стандартные (предопределённые) типы данных. Ниже приведены все предопределённые типы данных существующие в языке C#:
Перед тем как более детально рассматривать данные типы нужно сказать, что языки программирования делятся на строго-типизированные и динамически типизированные.
Под строго-типизированными языками программирования подразумевают языки в которых переменным при создании нужно указывать какого типа она будет и в будущем она не сможет хранить в себе значения других типов. Например, если будет создана переменная целочисленного типа, то в будущем записать в неё ту же строку "Hello world!!!"
не получится (будет ошибка).
Под динамически типизированными языками программирования подразумевают языки в которых переменная меняет свой тип в соответствии к данным которые она в себе хранит. Например, если изначально создать переменная «а» и в неё записать значение 2, то она будет числового типа, но после записи в неё строки "Hello world!!!"
(ошибки не будет!)- она станет строковой переменной.
C# относится к строго типизированным языкам программирования, поэтому созданные на нём переменные не могут изменять свой тип во время работы программы. Но поскольку Андерс Хейлсберг при разработке C# брал лучшие различные идеи из существующих на то время языков программирования, то в C# был добавлен отдельный тип данных позволяющий использовать динамическую типизацию – это тип dynamic. Данный тип имеет свои особенности использования, с которыми нужно ознакомиться перед его применением.
С рисунка выше видно, что предопределённые типы делятся на 4 вида:
- строковой тип (
string
); - динамический тип (
dynamic
); - тип
object
- данный тип является базовым типом для всех остальных; - простые типы.
Простые типы в свою очередь также делятся на две категории – это числовые и нечисловые.
Существует только два предопределённых нечисловых типа:
- тип
char
– в переменных данного типа можно хранить один символ в формате Unicode; - тип bool – многие слышали о изобретённой Джорджем Булем булевой логике (в данной логике говориться, что любое выражение может быть истинным (
true
) или ложным (false
)). Данный тип предоставляет возможность хранить результат выражений и соответственно может храниться только два значенияtrue
иfalse
.
Существует три вида предопределённых числовых типов:
- целочисленные – типы
byte
,sbyte
,short
,ushort
,int
,uint
,long
,ulong
– в переменных данных типов могут хранится только целые числа (например, -100, 45, 0). Некоторые из них (sbyte
,short
,int
,long
) могут хранить отрицательные числа, а некоторые нет (byte
,ushort
,uint
,ulong
). Приставкаu
означает, что ониunsigned
(без знаковые), а приставкаs – signed
(знаковые). - вещественные числа – типы
float
(число с одинарной точностью) иdouble
(число с двойной точностью) – в переменных данных типов могут хранится только вещественные числа (числа с плавающей точкой) - десятичные числа, а именно тип
decimal
– данный тип позволяет сохранять число без потери точности, как оно было передано в переменную таким и останется (в отличии от типовfloat
иdouble
где может произойти округление).
Каждый тип также имеет определённый размер, ниже наведена таблица в которой указываются размеры всех предопределённых типов в c#.
Размер переменных типа string зависит от того, сколько символов в записанной в них строке. Например, если в переменную записать строку "Hello world!!!"
, то её размер будет: 2 * 11 = 22
байта (размер каждого символа равен 2 байтам).
Размер переменной типа object
зависит от разрядности ОС в которой работает программа. Если система 32-разрядная, то размер переменной типа object
будет 4 байта, если в 64-разрядной, то 8 байт.
Также может возникнуть вопрос, а зачем нужно столько разных типов для хранения тех же целых чисел, на что ответ тоже очень прост: если нужно создать одну переменную, то нельзя заметить преимущества большого разнообразия, но если, например, будет создаваться массив который хранит в себе 1 000 000 переменных, то будет ощутимая разница если его элементы будут типа byte
или же int
(разница в размере массива при разных типах будет 3 000 000 байт, что достаточно ощутимо).
Поэтому есть правило, если нужно создать массив значений, которые попадают в диапазон типа с меньшим размером (например, в диапазон типа byte
), то не нужно использовать для их хранения тип с большим размером (например, в диапазон типа int
).
источник: видеоурок Александра Шевчука "ВИДЕОУРОК №2. МАШИННАЯ МАТЕМАТИКА И СИСТЕМЫ СЧИСЛЕНИЯ"