stringtranslate.com

Tipo de valor y tipo de referencia

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:

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::stringstd::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

  1. ^ Brown, Erik E. (2006). Windows Forms in Action. Shelter Island, New York: Manning. p. 703. ISBN 978-1-932-39465-8.
  2. ^ Stephens, Rod (2014). C# 5.0 Programmer's Reference. Indianapolis, Indiana: John Wiley & Sons. p. 57. ISBN 978-1-118-84728-2.
  3. ^ "Chapter 4. Types, Values, and Variables". docs.oracle.com.
  4. ^ "C# Keywords". docs.microsoft.com.
  5. ^ "Structures and Classes — The Swift Programming Language (Swift 5.2)". docs.swift.org.
  6. ^ "Closures — The Swift Programming Language (Swift 5.2)". docs.swift.org.
  7. ^ "Built-in Types — Python 3.8.2rc1 documentation". docs.python.org.
  8. ^ "ECMAScript® 2019 Language Specification". www.ecma-international.org.
  9. ^ "Chapter 24 The core library". caml.inria.fr.
  10. ^ "Modifiable Data Structures". caml.inria.fr.