¿Qué es un Reference Type?
Básicamente un Reference Type es aquel cuya variable almacena la dirección de memoria de sus datos en una zona de memoria denominada Stack. Los datos reales a los que hace referencia se encuentran en una zona de memoria llamada Heap.
Debido a que los reference types representan la dirección de los datos en lugar de los datos en sí mismo, asignar una variable de referencia a otra no copia los datos. En cambio, la asignación de una variable de reference type a otra instancia crea una segunda copia de la referencia, esto quiere decir que dos variables reference type pueden apuntar a los mismos datos.
Ejemplos de Reference Type son los siguientes:
- String.
- Los arrays, incluso si sus elementos son value types.
- Los tipos Class.
- Object
- Delegados.
- etc..
En el .NET Framework existen más de 2.500 reference types predefinidos de los cuales destacaremos los siguientes:
System.Object | El tipo Object es el tipo más general del .NET Framework. Todo tipo por referencia deriva de él. |
System.String | Datos de tipo texto o cadena. |
System.Text.StringBuilder | Datos de tipo texto o cadena dinámicos. |
System.Array | Matrices de datos. Esta es la clase base para todos los arrays. |
System.IO.Stream | Es un buffer para leer o escribir en un archivo, dispositivo, memoria, en la red, etc… |
System.Exception | Maneja las excepciones a nivel de aplicación o sistema. Es la clase base sobre la que heredan todos los tipos de excepción. |
Supongamos que definimos una clase muy básica:
class Class1 { public int Value = 0; }
Cuando instanciemos nuestra clase
Class1 myClass = new Class1();
En la memoria ocurre lo siguiente:
Como se puede observar en el Stack se almacena la referencia al objeto myClass y en el Heap se almacena el contenido de dicho objeto, en nuestro caso un entero llamado Value con valor 0.
Para ver que dos variables de referencia pueden apuntar a los mismos datos tenemos este ejemplo:
class Class1 { public int Value = 0; } class Test { static void Main() { Class1 r1 = new Class1(); Class1 r2 = r1; // r2 apunta a la misma zona de memoria que r1 r2.Value = 123; Console.WriteLine("El valor de los datos son: {0}, {1}", r1.Value, r2.Value); } } // La salida será la siguiente El valor de los datos son: 123, 123
Ya hemos aprendido qué es un Reference Type y junto al post anterior podemos ver las diferencias que existen con los Value Types.
Os dejo un enlace de la MSDN para profundizar un poco más en ello.
Hola.
Podrías poner un ejemplo de esto?:
En cambio, la asignación de una variable de reference type a otra instancia crea una segunda copia de la referencia, esto quiere decir que dos variables reference type pueden apuntar a los mismos datos.
El Object y String son también clases, de hecho, son los únicos tipos de datos básicos que son clases en vez de struct.
En un libro, leí que el String está ciertamente «modificado» internamente para que actúe como tipo por valor aunque sea por referencia.Estaría bien citarlo.
Me gustaMe gusta
Hola, si ejecutas el ejemplo de código expuesto, verás que se está apuntando a la misma referencia. Si quieres, puedes modificar el ejemplo de la siguiente manera.
Me gustaMe gusta
Gracias.
Aquí está a lo que me refería con la Clase String, que a pesar de ser por tipo de referencia, actúa como si fuera de tipo por valor.
Página 101:
Haz clic para acceder a lenguajeCsharp.pdf
Según indica, es porque han modificado internamente el operador de igualdad para este caso.
Me gustaMe gusta
Hola, puedes revisar el código fuente de la clase String en String Class.
Si te fijas en la definición de los operadores de igualdad y diferencia.
Se hace una llamada a String.Equals() cuyo código lo que hace es comparar el contenido de la cadena. Muchas gracias por tus aportaciones.
Me gustaMe gusta