Ejercicio: Detección de tipos de referencia
- 8 minutos
Los tipos de referencia incluyen matrices, clases y cadenas. Además, estos tipos se tratan de forma diferente a los tipos de valor en cuanto a la manera en que se almacenan los valores cuando se ejecuta la aplicación.
En este ejercicio, conoceremos las diferencias entre los tipos de referencia y los tipos de valor, y cómo usar el operador new para asociar una variable a un valor en la memoria del equipo.
Diferencias entre los tipos de referencia y los tipos de valor
Una variable de tipo de valor almacena sus valores directamente en un área de almacenamiento denominada pila. La pila es la memoria asignada al código que se está ejecutando actualmente en la CPU (también denominado marco de pila o marco de activación). Cuando el marco de pila termina de ejecutarse, se quitan los valores de la pila.
Una variable de tipo de referencia almacena sus valores en una región de memoria independiente denominada montón. El montón es un área de la memoria compartida entre muchas aplicaciones que se ejecutan en el sistema operativo al mismo tiempo. El runtime de .NET se comunica con el sistema operativo para determinar qué direcciones de memoria están disponibles y solicita una dirección donde pueda almacenar el valor. Después, el runtime de .NET almacena el valor y devuelve la dirección de memoria a la variable. Cuando el código usa la variable, el runtime de .NET busca eficazmente la dirección almacenada en la variable y recupera el valor que está almacenado.
A continuación, vamos a escribir código que muestre estas ideas con mayor claridad.
Definición de una variable de tipo de referencia
Elimine o use el operador de comentario de línea
//para comentar todo el código de los pasos anteriores.Actualice el código en el editor de Visual Studio Code de la siguiente manera:
int[] data;En el código anterior se define una variable que puede contener un valor de tipo matriz
int.En este punto,
dataes simplemente una variable que podría contener una referencia, o en su lugar, una dirección de memoria de un valor del montón. Como no apunta a una dirección de memoria, se denomina referencia nula.Creación de una instancia de la matriz
intcon la palabra clavenewActualice el código en el Editor de Visual Studio Code para crear y asignar una nueva instancia de la matriz
intmediante el código siguiente:int[] data; data = new int[3];La palabra clave
newindica al entorno de ejecución de .NET que cree una instancia de la matrizinty, después, que se coordine con el sistema operativo para almacenar la matriz de tres valores int en la memoria. El runtime de .NET cumple estas instrucciones y devuelve una dirección de memoria de la nueva matrizint. Por último, la dirección de memoria se almacena en los datos de la variable. Los elementos de la matrizinttienen0como valor predeterminado, ya que es el valor predeterminado deint.Modificación del ejemplo de código para que realice ambas operaciones en una sola línea de código
Las dos líneas de código del paso anterior se acortan normalmente en una sola línea de código para declarar la variable y crear una nueva instancia de la matriz
int. Modifique el código del paso 3 para que coincida con el siguiente.int[] data = new int[3];Aunque no se puede observar ninguna salida, esperamos que este ejercicio haya servido para explicar cómo se relaciona la sintaxis de C# con los pasos del proceso para trabajar con tipos de referencia.
¿Qué hay de diferente en el tipo de datos de cadena de C#?
El tipo de datos string también es un tipo de referencia. Es posible que se pregunte por qué no usamos el operador new cuando declaramos una cadena. Esta es una ventaja que ofrecen los diseñadores de C#. Dado que el tipo de datos string se usa con mucha frecuencia, podemos usar este formato:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
En segundo plano, sin embargo, se crea y se inicializa una nueva instancia de System.String en "Hola mundo".
Problemas prácticos que usan tipos de valor y referencia
-
Tipo de valor (int): En este ejemplo,
val_Ayval_Bson tipos de valor enteros.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
Debería ver el siguiente resultado:
--Value Types--
val_A: 2
val_B: 5
Cuando se ejecuta val_B = val_A , el valor de val_A se copia y almacena en val_B. Por lo tanto, cuando se cambia val_B, val_A sigue sin verse afectado.
-
Tipo de referencia (matriz): En este ejemplo,
ref_Ayref_Bson tipos de referencia de matriz.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
Debería ver el siguiente resultado:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
Cuando se ejecuta ref_B = ref_A, ref_B apunta a la misma ubicación de memoria que ref_A. Por lo tanto, cuando se cambia ref_B[0], ref_A[0] también cambia porque ambos apuntan a la misma ubicación de memoria. Se trata de una diferencia clave entre los tipos de valor y los tipos de referencia.
Resumen
- Los tipos de valor pueden contener valores más pequeños y se almacenan en la pila. Los tipos de referencia pueden contener valores grandes y, para crear una nueva instancia de un tipo de referencia, se usa el operador
new. Las variables de tipo de referencia contienen una referencia (la dirección de memoria) al valor real almacenado en el montón. - Los tipos de referencia incluyen matrices, cadenas y clases.
Comprobación de conocimientos
Comentarios
¿Le ha resultado útil esta página?
No
¿Necesita ayuda con este tema?
¿Desea intentar usar Ask Learn para aclarar o guiarle a través de este tema?