Найти в Дзене

Тип-значение в программировании

В программировании не только данные делятся на типы, но и сами типы тоже бывают разных видов. Всё это специально, чтобы запутать начинающих программистов ))) Видимо поэтому (чтобы упростить жизнь программистам) многие современные языки программирования являются нетипизированными. Хотя лично для меня это скорее недостаток, чем преимущество. Переменные разных типов занимают в памяти разный объём. Например, в C# тип int занимает 4 байта, а C++ не менее 2 (обычно зависит от реализации и/или от архитектуры компьютера). Но в любом случае это фиксированный размер. То есть в C# переменная типа int будет ВСЕГДА занимать в памяти 4 байта, независимо от того, какое число в ней хранится, 0, -1 или 2000000. Значение такой переменной хранится непосредственно в том месте памяти, на которое указывает переменная. То есть переменная напрямую связана со значением. Поэтому такие типы данных называются типы-значения (values types). Кстати, размер типа в байтах вы можете получить, например, так: sizeof(int)

В программировании не только данные делятся на типы, но и сами типы тоже бывают разных видов. Всё это специально, чтобы запутать начинающих программистов ))) Видимо поэтому (чтобы упростить жизнь программистам) многие современные языки программирования являются нетипизированными. Хотя лично для меня это скорее недостаток, чем преимущество.

Переменные разных типов занимают в памяти разный объём. Например, в C# тип int занимает 4 байта, а C++ не менее 2 (обычно зависит от реализации и/или от архитектуры компьютера). Но в любом случае это фиксированный размер. То есть в C# переменная типа int будет ВСЕГДА занимать в памяти 4 байта, независимо от того, какое число в ней хранится, 0, -1 или 2000000.

Значение такой переменной хранится непосредственно в том месте памяти, на которое указывает переменная. То есть переменная напрямую связана со значением. Поэтому такие типы данных называются типы-значения (values types).

Кстати, размер типа в байтах вы можете получить, например, так:

sizeof(int)

Если у нас есть две переменных А и В, то вот такая операция присваивания:

А = В;

просто поместит значение переменной В в переменную А. И никаких дополнительных действий для этой операции не потребуется: процессор возьмёт значение из памяти, которая связана с В, и поместит это значение в память, которая связана с А.

В C# к типам-значениям относятся, например, int, double, bool, decimal и другие подобные. Значения переменных этих типов хранятся в стеке - особой области памяти.

Кроме типов-значений существуют ещё ссылочные типы. Переменные этих типов также связаны с каким-то местом в памяти, но там хранятся не значения, а ссылки - адреса на другое место в памяти, где уже хранятся значения (данные). Ссылочные типы обычно используется для больших объёмов данных, а также тогда, когда объём памяти, необходимый для хранения данных, заранее неизвестен.

Например, строка изначально может содержать 1…2 символа или вообще быть пустой, а в хоре работы программы содержимое её может меняться в широких пределах.

Тип string в C# является ссылочным, хотя компилятор рассматривает его особым образом, поскольку работать со строками программистам приходится очень часто. Поэтому для программиста достаточно объявить переменную типа string и работать с ней как с обычной переменной. То есть не надо выделять и освобождать память. Всё это делается автоматически, так что внешне поведение ссылочного типа string не отличить от типа-значения.

Кстати, определить размер переменной (именно переменной, а не типа данных) в C# оказалось непростой задачей. Немного поковырялся в Интернете, нашёл такой совет:

System.Runtime.InteropServices.Marshal.SizeOf(Переменная)

Однако эта шутка возвращает размер объекта, а не размер типа данных, к которому принадлежит переменная. Поэтому для переменной типа bool, он вернёт 4 байта, хотя этот типа занимает 1 байт. Потому что все переменные в C# - это объекты. Вот мы и получаем 4 байта. А чтобы получить таки именно размер типа, с которым связана переменная, придётся так не хило поизвращаться. Но это уже другая история…

А напоследок немного исходного кода с комментариями:

И ещё. Получить тип переменной можно так:

Переменная.GetType

Но впихнуть результат в sizeof не получится. Поскольку sizeof - это не функция, а оператор для компилятора, и он обрабатывается на этапе компиляции, а не во время выполнения программы.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.