Система типов, тип данных, значимые и ссылочные типы¶
Представьте, что вы находитесь в центре пустыни Невады и вокруг вас на максимальной скорости хаотично разъезжают сотни ревущих бульдозеров, за рулем которых сидят макаки с завязанными глазами. Кажется, что дожить до момента, когда у них закончится топливо, практически не реально. Подобный пример максимально близко описывает отсутствие типизации. Противоположностью является продуманная дорожная инфраструктура, состоящая не только из самих дорог, но и подземных\наземных переходов, светофоров и регулировщиков. Ключевым моментом является понимание того, что ваша безопасность достигается путем ограничения транспорта. Другими словами типизация, сопоставимая с дорожной инфраструктурой, ограничивает возможности разработчика таким образом, что процесс создания программ становится для него более комфортным. Типизация не расширяет возможности разработчиков, она их ограничивает, пуская их энергию в правильное русло.
В зависимости от среды выполнения, операции над данными могут быть ограничены некими правилами. Для каждого конкретного вида данных декларируются конкретные правила. В роли конкретного свода правил выступает тип данных.
Среда выполнения, в которой отсутствует классификация данных и ограничения на операции над ними, не имеет типов, поэтому такую среду выполнения справедливо называть нетипизированной. И наоборот, среду выполнения, которая классифицирует данные и операции над ними, справедливо называть типизированной.
В основе любой типизированной среды выполнения лежит такое фундаментальное понятие, как система типов. Сложно сформулировать исчерпывающие определение термину система типов, затронув все аспекты, все значения, которые вкладывают в этот термин разработчики из различных областей, поэтому конкретизируем его самым простым определением.
Система Типов¶
Система Типов - это совокупность правил, назначающих конструкциям, составляющим программу, свойства (имеется ввиду характеристики), именуемые типами. Обычно к конструкциям, нуждающимся в аннотации типов, относятся переменные, поля и свойства объектов, а также параметры и возвращаемые функциями значения.
В основе системы типов любого языка программирования всегда лежит базисная система типов, встроенных в язык. К базисным или встроенным типам относятся такие типы как byte
, int
, string
, boolean
, object
и им подобные. На их основе среда выполнения или разработчик могут определять типы данных более высокого уровня, например, Date
или Array
.
Тип данных (тип)¶
Понятие тип является фундаментальным в теории программирования. Тип данных (или просто тип) — это характеристика, определяющая множество значений и операций, которые могут быть выполнены над этими данными.
В зависимости от языка программирования, тип данных может хранить информацию о данных, к которым относятся поля, свойства, методы и другие структуры языка, а также о том, в каком месте, в стеке (stack) или куче (heap) будет выделяться память во время выполнения программы и её объем; в каких операциях (как, например, сложение +
, умножение *
, присваивание =
и т.д.) может участвовать тип данных.
Типы данных делятся на два вида:
- типы значения (value type) - хранят значение (их ещё называют значимыми типами)
- ссылочные типы (reference types) - хранят ссылку на значение
При операции присваивания значения, принадлежащего к значимому типу, данные копируются (дублируются) в памяти. При операции присваивания значения, принадлежащего к ссылочным типам, копируется лишь ссылка на данные.
Тип данных, передающийся по значению (примитивный тип)¶
Когда переменная, ассоциированная со значением, принадлежащим к значимому типу, участвует в операции присвоения, операнд из левой части будет ассоциирован не со значением правого операнда, а с его копией. Другими словами, значение будет дублировано в памяти, и переменные будут ассоциированы с разными значениями-участками памяти. При изменении любой переменной своего значения, значения других переменных затронуты не будут.
Обычно говорят, что переменные с типом значения хранят значение и передаются по значению.
Тип данных, передающийся по ссылке¶
Если переменная, ассоциированная со ссылочным типом данных, участвует в операции присваивания, операнду из левой части будет присвоена ссылка на значение, с которым ассоциирован операнд из правой части. Другими словами обе переменные будут ассоциированы с одним и тем же значением и участком памяти. В таком случае, если изменить значение любой ссылочной переменной, изменения затронут все переменные, ассоциированные с этим значением.
Обычно говорят, что переменные ссылочного типа ссылаются на значение и передаются по ссылке.