En ciertos lenguajes de programación de computadoras , los tipos de datos se clasifican como tipos de valor o tipos de referencia , donde siempre se accede implícitamente a los tipos de referencia a través de referencias , mientras que las variables de tipo de valor contienen directamente los valores mismos. [1] [2]
Propiedades de tipos de valor y tipos de referencia
Incluso entre los idiomas que tienen esta distinción, las propiedades exactas de los tipos de valor y referencia varían de un idioma a otro, pero las propiedades típicas incluyen:
- Los tipos de datos primitivos , como los booleanos, los enteros de tamaño fijo, los valores de punto flotante y los caracteres, son tipos de valores.
- Los objetos, en el sentido de la programación orientada a objetos , pertenecen a tipos de referencia.
- La asignación a una variable de tipo de referencia simplemente copia la referencia, mientras que la asignación a una variable de tipo de valor copia el valor. Esto se aplica a todo tipo de variables, incluidas variables locales, campos de objetos y elementos de matriz. Lo mismo ocurre cuando se llama a una función: los parámetros de tipo de referencia son copias de la referencia, mientras que los parámetros de tipo de valor son copias del valor.
- Si un tipo de referencia es mutable , las mutaciones realizadas a través de una referencia son visibles a través de cualquier otra, mientras que si un tipo de valor es mutable, las mutaciones realizadas en un valor no son visibles en otro.
- Los tipos de referencia respaldan la noción de identidad : tiene sentido discutir si dos valores de tipo de referencia se refieren al mismo objeto, y el lenguaje proporciona funcionalidad para determinar si lo hacen, mientras que los tipos de valor no.
- Nulo pertenece a todos los tipos de referencia; es decir, un valor de tipo de referencia puede ser nulo en lugar de una referencia a un objeto.
- Los valores de tipo de referencia se refieren a objetos asignados en el montón, mientras que los valores de tipo de valor están contenidos en la pila de llamadas (en el caso de variables locales y parámetros de función) o dentro de las entidades que los contienen (en el caso de campos de objetos y matrices). elementos). (Con los tipos de referencia, es solo la referencia misma la que está contenida en la pila de llamadas o dentro de una entidad contenedora).
- Los tipos de referencia admiten la noción de subtipo , según la cual todos los valores de un tipo de referencia determinado son automáticamente valores de un tipo de referencia diferente. Los tipos de valor no admiten subtipos, pero pueden admitir otras formas de conversión de tipos implícita , por ejemplo, convertir automáticamente un número entero en un número de punto flotante si es necesario. Además, puede haber conversiones implícitas entre ciertos valores y tipos de referencia, por ejemplo, "encajonar" una primitiva
int
(un tipo de valor) en un Integer
objeto (un tipo de objeto), o revertir esto mediante "unboxing".
Tipos de referencia y "llamar compartiendo"
Incluso cuando los argumentos de función se pasan utilizando la semántica de "llamada por valor" (que siempre es el caso en Java y de forma predeterminada en C#), un valor de un tipo de referencia es intrínsecamente una referencia; por lo tanto, si un parámetro pertenece a un tipo de referencia, el comportamiento resultante tiene cierta semejanza con la semántica de "llamada por referencia". Este comportamiento a veces se denomina llamada compartiendo .
La llamada por compartir se parece a la llamada por referencia en el caso en que una función muta un objeto que recibió como argumento: cuando eso sucede, la mutación también será visible para la persona que llama, porque la persona que llama y la función tienen referencias al mismo objeto. . Se diferencia de la llamada por referencia en el caso en que una función asigna su parámetro a una referencia diferente; cuando eso sucede, esta asignación no será visible para la persona que llama, porque la persona que llama y la función tienen referencias separadas , aunque ambas referencias inicialmente apunten al mismo objeto.
Tipos de referencia versus punteros explícitos
Muchos idiomas tienen indicaciones o referencias explícitas . Los tipos de referencia se diferencian de estos en que siempre se accede a las entidades a las que hacen referencia a través de referencias; por ejemplo, mientras que en C++ es posible tener a y a , donde la primera es una cadena mutable y la segunda es un puntero explícito a una cadena mutable (a menos que sea un puntero nulo), en Java solo es posible tener un , que es implícitamente una referencia a una cadena mutable (a menos que sea una referencia nula).std::string
std::string *
StringBuilder
Si bien el enfoque de C++ es más flexible, el uso de no referencias puede generar problemas como la división de objetos , al menos cuando se usa la herencia ; en lenguajes donde los objetos pertenecen a tipos de referencia, estos problemas se evitan automáticamente, a costa de eliminar algunas opciones del programador.
Clasificación por idioma
See also
References
- ^ Brown, Erik E. (2006). Windows Forms in Action. Shelter Island, New York: Manning. p. 703. ISBN 978-1-932-39465-8.
- ^ Stephens, Rod (2014). C# 5.0 Programmer's Reference. Indianapolis, Indiana: John Wiley & Sons. p. 57. ISBN 978-1-118-84728-2.
- ^ "Chapter 4. Types, Values, and Variables". docs.oracle.com.
- ^ "C# Keywords". docs.microsoft.com.
- ^ "Structures and Classes — The Swift Programming Language (Swift 5.2)". docs.swift.org.
- ^ "Closures — The Swift Programming Language (Swift 5.2)". docs.swift.org.
- ^ "Built-in Types — Python 3.8.2rc1 documentation". docs.python.org.
- ^ "ECMAScript® 2019 Language Specification". www.ecma-international.org.
- ^ "Chapter 24 The core library". caml.inria.fr.
- ^ "Modifiable Data Structures". caml.inria.fr.