[.NET] Qué es un Reference Type.


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

Captura

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.

Reference Types (C# Reference)

4 comentarios en “[.NET] Qué es un Reference Type.

  1. 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 gusta

    1. 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.

      class Class1
      {
      	public int Value = 0;
      }
      class Test
      {
      	static void Main()
      	{
      		Class1 r1 = new Class1();
      		Class1 r2 = new Class1(); // se instancia una nueva referencia a un objeto de tipo 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);
      	}
      }
      

      Me gusta

    1. 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.

      public static bool operator == (String a, String b) 
      {
          return String.Equals(a, b);
      }
       
      public static bool operator != (String a, String b) 
      {
          return !String.Equals(a, b);
      }
      

      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 gusta

Replica a Sergio Parra Guerra Cancelar la respuesta