Jump to content

Тип значения и ссылочный тип

В некоторых языках программирования типы данных классифицируются как типы значений или ссылочные типы , где ссылочные типы всегда неявно доступны через ссылки , тогда как переменные типа значения непосредственно содержат сами значения . [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] неизменяемые символы, неизменяемые целые числа, неизменяемые числа с плавающей запятой, неизменяемые кортежи, неизменяемые перечисления (включая неизменяемые единицы, неизменяемые логические значения, неизменяемые списки, неизменяемые дополнительные параметры), неизменяемые исключения, неизменяемые строки форматирования массивы, неизменяемые строки, байтовые строки, словари

См. также

[ редактировать ]
  1. ^ Браун, Эрик Э. (2006). Windows Forms в действии . Остров Шелтер, Нью-Йорк: Мэннинг. п. 703. ИСБН  978-1-932-39465-8 .
  2. ^ Стивенс, Род (2014). Справочник программиста C# 5.0 . Индианаполис, Индиана: Джон Уайли и сыновья. п. 57. ИСБН  978-1-118-84728-2 .
  3. ^ «Глава 4. Типы, значения и переменные» . docs.oracle.com .
  4. ^ «Ключевые слова C#» . docs.microsoft.com .
  5. ^ «Структуры и классы — язык программирования Swift (Swift 5.2)» . docs.swift.org .
  6. ^ «Замыкания — язык программирования Swift (Swift 5.2)» . docs.swift.org .
  7. ^ «Встроенные типы — документация Python 3.8.2rc1» . docs.python.org .
  8. ^ «Спецификация языка ECMAScript® 2019» . www.ecma-international.org .
  9. ^ «Глава 24. Основная библиотека» . caml.inria.fr .
  10. ^ «Изменяемые структуры данных» . caml.inria.fr .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2e8f751a531db01cf6c2bfab03f26066__1693713420
URL1:https://arc.ask3.ru/arc/aa/2e/66/2e8f751a531db01cf6c2bfab03f26066.html
Заголовок, (Title) документа по адресу, URL1:
Value type and reference type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)