В любом современном языке программирования существуют стандартные (предопределённые) типы данных. Ниже приведены все предопределённые типы данных существующие в языке 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. МАШИННАЯ МАТЕМАТИКА И СИСТЕМЫ СЧИСЛЕНИЯ"
предыдущая статья