Тип значения и ссылочный тип
В некоторых языках программирования типы данных классифицируются как типы значений или ссылочные типы , где ссылочные типы всегда неявно доступны через ссылки , тогда как переменные типа значения непосредственно содержат сами значения . [1] [2]
Свойства типов значений и ссылочных типов
[ редактировать ]Даже среди языков, в которых есть это различие, точные свойства типов значений и ссылочных типов различаются от языка к языку, но типичные свойства включают:
- Примитивные типы данных , такие как логические значения, целые числа фиксированного размера, значения с плавающей запятой и символы, являются типами значений.
- Объекты в смысле объектно-ориентированного программирования относятся к ссылочным типам.
- Присвоение переменной ссылочного типа просто копирует ссылку, тогда как присвоение переменной типа значения копирует значение. Это относится ко всем видам переменных, включая локальные переменные, поля объектов и элементы массива. Аналогично при вызове функции: параметры ссылочного типа являются копиями ссылки, тогда как параметры типа значения являются копиями значения.
- Если ссылочный тип является изменяемым , то мутации, сделанные с помощью одной ссылки, видны через любую другую, тогда как если тип значения является изменяемым, то мутации, сделанные с одним значением, не видны в другом.
- Ссылочные типы поддерживают понятие идентичности — имеет смысл обсудить, ссылаются ли два значения ссылочного типа на один и тот же объект, и язык предоставляет функциональные возможности для определения того, относятся ли они к одному и тому же объекту, тогда как типы значений этого не делают.
- Null принадлежит каждому ссылочному типу; то есть значение ссылочного типа может быть нулевым, а не ссылкой на объект.
- Значения ссылочного типа относятся к объектам, размещенным в куче, тогда как значения типа значения содержатся либо в стеке вызовов (в случае локальных переменных и параметров функции), либо внутри содержащих их сущностей (в случае полей объектов и массива). элементы). (В случае ссылочных типов только сама ссылка содержится либо в стеке вызовов, либо внутри содержащей сущности.)
- Ссылочные типы поддерживают идею подтипирования , при которой все значения данного ссылочного типа автоматически становятся значениями другого ссылочного типа. Типы значений не поддерживают подтипирование, но могут поддерживать другие формы неявного преобразования типов , например автоматическое преобразование целого числа в число с плавающей запятой, если это необходимо. Кроме того, могут быть неявные преобразования между определенными типами значений и ссылочными типами, например, «упаковка» примитива.
int
(тип значения) вInteger
объект (тип объекта) или отменить его посредством «распаковки».
Типы ссылок и «вызов путем совместного использования»
[ редактировать ]Даже когда аргументы функции передаются с использованием семантики «вызов по значению» (что всегда имеет место в Java и по умолчанию в C#), значение ссылочного типа по своей сути является ссылкой; поэтому, если параметр принадлежит ссылочному типу, результирующее поведение имеет некоторое сходство с семантикой «вызова по ссылке». Такое поведение иногда называют вызовом путем обмена .
Вызов путем совместного использования напоминает вызов по ссылке в случае, когда функция изменяет объект, который она получила в качестве аргумента: когда это произойдет, мутация также будет видна вызывающему объекту, поскольку вызывающий объект и функция имеют ссылки на один и тот же объект. . Он отличается от вызова по ссылке в случае, когда функция присваивает свой параметр другой ссылке; когда это произойдет, это присвоение не будет видно вызывающему объекту, поскольку вызывающий объект и функция имеют отдельные ссылки, даже если обе ссылки изначально указывают на один и тот же объект.
Ссылочные типы и явные указатели
[ редактировать ]Многие языки имеют явные указатели или ссылки. Ссылочные типы отличаются от них тем, что доступ к сущностям, на которые они ссылаются, всегда осуществляется через ссылки; например, тогда как в C++ возможно иметь либо std::string
и std::string *
, где первая является изменяемой строкой, а вторая является явным указателем на изменяемую строку (если это не нулевой указатель), в Java возможно иметь только StringBuilder
, что неявно является ссылкой на изменяемую строку (если только это не нулевая ссылка).
Хотя подход C++ более гибок, использование не-ссылок может привести к таким проблемам, как нарезка объектов , по крайней мере, при наследования использовании ; в языках, где объекты принадлежат ссылочным типам, этих проблем можно избежать автоматически за счет удаления некоторых опций у программиста.
Классификация по языкам
[ редактировать ]Язык | Тип значения | Тип ссылки |
---|---|---|
Ява [3] | все необъектные типы, включая (например) логические значения и числа | все типы объектов, включая (например) массивы |
С# [4] | все типы, не являющиеся объектами, включая структуры и перечисления, а также примитивные типы | все типы объектов, включая классы и интерфейсы |
Быстрый [5] [6] | структуры (включая, например, логические значения, числа, строки и наборы) и перечисления (включая, например, необязательные параметры) | функции, замыкания, классы |
Питон [7] | все типы | |
JavaScript [8] | все необъекты, включая логические значения, числа с плавающей запятой и строки, среди прочего | все объекты, включая функции и массивы, среди прочего |
OCaml [9] [10] | неизменяемые символы, неизменяемые целые числа, неизменяемые числа с плавающей запятой, неизменяемые кортежи, неизменяемые перечисления (включая неизменяемые единицы, неизменяемые логические значения, неизменяемые списки, неизменяемые дополнительные параметры), неизменяемые исключения, неизменяемые строки форматирования | массивы, неизменяемые строки, байтовые строки, словари |
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Браун, Эрик Э. (2006). Windows Forms в действии . Остров Шелтер, Нью-Йорк: Мэннинг. п. 703. ИСБН 978-1-932-39465-8 .
- ^ Стивенс, Род (2014). Справочник программиста C# 5.0 . Индианаполис, Индиана: Джон Уайли и сыновья. п. 57. ИСБН 978-1-118-84728-2 .
- ^ «Глава 4. Типы, значения и переменные» . docs.oracle.com .
- ^ «Ключевые слова C#» . docs.microsoft.com .
- ^ «Структуры и классы — язык программирования Swift (Swift 5.2)» . docs.swift.org .
- ^ «Замыкания — язык программирования Swift (Swift 5.2)» . docs.swift.org .
- ^ «Встроенные типы — документация Python 3.8.2rc1» . docs.python.org .
- ^ «Спецификация языка ECMAScript® 2019» . www.ecma-international.org .
- ^ «Глава 24. Основная библиотека» . caml.inria.fr .
- ^ «Изменяемые структуры данных» . caml.inria.fr .