Articulo de referencia

Value type and reference type

In certain computer programming languages , data types are classified as either value types or reference types , where values referenced by reference type variables are always i...

In certain computer programming languages, data types are classified as either value types or reference types, where values referenced by reference type variables are always implicitly accessed via references stored in those variables, whereas value type variables directly contain the values themselves.[1][2]

Properties of value types and reference types

Even among languages that have this distinction, the exact properties of value and reference types vary from language to language, but typical properties include:

  • Primitive data types, such as Booleans, fixed-size integers, floating-point values, and characters, are value types.
  • Objects, in the sense of object-oriented programming, belong to reference types.
  • Assigning to a variable of reference type simply copies the reference, whereas assigning to a variable of value type copies the value. This applies to all kinds of variables, including local variables, fields of objects, and array elements. Likewise when calling a function: parameters of reference type are copies of the reference, whereas parameters of value type are copies of the value.
  • If a reference type is mutable, then mutations made via one reference are visible via any other, whereas if a value type is immutable, then mutations made to one value are not visible in another.
  • Reference types support the notion of identity it makes sense to discuss whether two values of reference type refer to the same object, and the language provides functionality to determine whether they do whereas value types do not.
  • Values of reference type refer to objects allocated in the heap, whereas values of value type are contained either on the call stack (in the case of local variables and function parameters) or inside their containing entities (in the case of fields of objects and array elements). (With reference types, it is only the reference itself that is contained either on the call stack or inside a containing entity.)
  • Los tipos de referencia admiten la noción de subtipado , por la cual todos los valores de un tipo de referencia dado se convierten automáticamente en valores de un tipo de referencia diferente. Los tipos de valor no admiten subtipado, pero pueden admitir otras formas de conversión de tipo implícita , por ejemplo, convertir automáticamente un entero a un número de coma flotante si es necesario. Además, puede haber conversiones implícitas entre ciertos tipos de valor y de referencia, por ejemplo, convertir un tipo primitivo (un tipo de valor) en un objeto (un tipo de objeto), o revertir este proceso mediante la conversión inversa.intInteger

Tipos de referencia y "llamada mediante compartición"

Incluso cuando los argumentos de una función se pasan utilizando la semántica de "paso por valor" (lo cual siempre ocurre en Java y es el caso por defecto 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 se asemeja en cierta medida a la semántica de "paso por referencia". Este comportamiento a veces se denomina paso por compartición .

La llamada por compartición se asemeja a la llamada por referencia cuando una función modifica un objeto recibido como argumento: en ese caso, la modificación será visible para quien realiza la llamada, ya que tanto la función como quien la realiza tienen referencias al mismo objeto. Se diferencia de la llamada por referencia cuando una función asigna su parámetro a una referencia distinta; en ese caso, esta asignación no será visible para quien realiza la llamada, ya que tanto la función como quien la realiza tienen referencias separadas , aunque inicialmente ambas apunten al mismo objeto.

Tipos de referencia frente a punteros explícitos

Muchos lenguajes tienen punteros o referencias explícitas . Los tipos de referencia se diferencian de estos en que las entidades a las que se refieren siempre se acceden a través de referencias; por ejemplo, mientras que en C++ es posible tener un y un , donde el primero es una cadena mutable y el segundo 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 tipos que no son referencias puede generar problemas como la segmentación de objetos , al menos cuando se utiliza la herencia ; en lenguajes donde los objetos pertenecen a tipos de referencia, estos problemas se evitan automáticamente, a costa de eliminar algunas opciones para el programador.

Reenlace de referencia y alias

En la mayoría de los lenguajes de programación, es posible cambiar la variable de un tipo de referencia para que apunte a otro objeto, es decir, reasignar la variable a otro objeto.

Por ejemplo, en el siguiente código Java:

clase Foo { público int a ; }Foo a = new Foo (); Foo b = a ; a . prop = 3 ; a = new Foo (); a . prop = 1 ;

Fooes un tipo de referencia, donde ainicialmente se le asigna una referencia a un nuevo objeto, y bse le asigna a la misma referencia de objeto, es decir, vinculado al mismo objeto que a, por lo tanto, los cambios a través de atambién son visibles para b. Posteriormente, ase le asigna una referencia (revinculación) a otro nuevo objeto, y ahora ay bse refieren a objetos diferentes. Al final, ase refiere al segundo objeto con su propcampo que tiene el valor 1, mientras que bse refiere al primer objeto con su propcampo que tiene el valor 3.

Sin embargo, al igual que en C++, el término "tipo de referencia" se utiliza para referirse a un alias, y no es posible volver a enlazar una variable de tipo de referencia una vez creada, ya que es un alias del objeto original.

clase Foo { público : int a ; };Foo a ; a . prop = 1 ; Foo & b = a ; Foo c = a ; a . prop = 3 ;

En C++, todos los tipos de clases que no son referencias tienen semántica de valor. En el ejemplo anterior, bse declara como una referencia (alias) de a, y para todos los efectos, ay bson lo mismo. Es imposible reasignar bpara que se convierta en algo diferente. Después de ejecutar el ejemplo anterior, ay bson el mismo Fooobjeto, propsiendo 3, mientras que ces una copia del original , asiendo .prop1

En C#, además de la distinción entre tipos de valor y tipos de referencia, existe un concepto aparte llamado variables de referencia. [ 3 ] Una variable de referencia, una vez declarada y vinculada, se comporta como un alias de la variable original, pero también puede vincularse a otra variable mediante el operador de asignación de referencia = ref. La variable en sí puede ser de cualquier tipo, incluidos los tipos de valor y los tipos de referencia; es decir, al pasar una variable de tipo referencia por referencia (alias) a una función, el objeto al que apunta la variable de tipo referencia también puede cambiar, además del objeto mismo (si es mutable).

Tipos de datos inmutables

Si un objeto es inmutable y la igualdad entre objetos se evalúa por su contenido en lugar de su identidad, la distinción entre tipos de valor y tipos de referencia deja de ser clara, ya que el objeto en sí no puede modificarse, sino solo reemplazarse por completo (para los tipos de valor) o por la referencia que apunta a otro objeto (para los tipos de referencia). Pasar dichos objetos inmutables entre variables no presenta diferencias observables si el objeto se copia o se pasa por referencia, a menos que se tenga en cuenta su identidad. En un lenguaje de programación funcional donde nada es mutable (como Haskell), esta distinción no existe y se convierte en un detalle de implementación.

Clasificación por idioma

Véase también

Referencias

  1. Brown, Erik E. (2006). Windows Forms in Action . Shelter Island, Nueva York: Manning. pág.  703. ISBN 978-1-932-39465-8.
  2. Stephens, Rod (2014). C# 5.0 Programmer's Reference . Indianápolis, Indiana: John Wiley & Sons. pág. 57. ISBN  978-1-118-84728-2.
  3. "Variables de referencia" .
  4. " Capítulo 4. Tipos, valores y variables" . docs.oracle.com
  5. "Palabras clave de C#" . docs.microsoft.com .
  6. "Estructuras y clases: el lenguaje de programación Swift (Swift 5.2)" . docs.swift.org .
  7. "Cierres — El lenguaje de programación Swift (Swift 5.2)" . docs.swift.org .
  8. "Tipos integrados — Documentación de Python 3.8.2rc1" . docs.python.org .
  9. "Especificación del lenguaje ECMAScript® 2019" . www.ecma-international.org .
  10. "Trait Copy en std::marker — Rust" . rust-lang.org .
  11. "Capítulo 24 La biblioteca principal" . caml.inria.fr .
  12. "Estructuras de datos modificables" . caml.inria.fr .
  13. "PHP: Lo básico" .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Value_type_and_reference_type&oldid=1342201858 "