Después de introducir un valor o texto en una celda, puede modifcarla de varias formas. Puede eliminar el contenido por completo, introducir un valor diferente para reemplazar el que estaba o alterar lo que ingresó.
Una buena forma de comprender cómo los valores se diferencian de los tipos de referencia es visualizar cómo se representa cada uno de ellos en memoria. La Figura 2-1 muestra cómo se crean los tipos de valor en memoria. Cuando crea una variable de tipo int, se crea una ubicación en memoria que puede utilizar para almacenar un valor del tipo int. Inicialmente, cuando no asigna un valor de forma explícita, el valor predeterminado del tipo de datos (para un int el valor predeterminado es 0) se almacena en la ubicación en memoria. Cuando se realiza una asignación, la dirección de memoria identifcada por el nombre de la variable se actualiza con el nuevo valor (10 en el caso de la asignación en la Figura 2-1).
Tome Nota
Las estructuras se utilizan generalmente para crear tipos simples. Si se encuentra creando una estructura muy compleja, considere mejor utilizar una clase.
ETC IBEROÁMERICA
La Figura 2-2 muestra un tipo de referencia, el tipo de datos string. Cuando crea una variable de tipo string, se crea una ubicación en memoria que se identifcará por este nombre. Sin embargo, esta ubicación en memoria no va a albergar el contenido del string. Esta variable almacenará la dirección en memoria (una referencia) de la ubicación donde de hecho se almacenará el string.
Inicialmente, cuando no se asigna un valor, la variable tendrá el valor de null (una referencia null, en otras palabras, esta variable no hace referencia a una dirección en memoria válida). En la siguiente sentencia, cuando dice:
name = “Northwind”;
la cadena “Northwind” se crea en una ubicación de memoria en particular (para simplifcar, digamos que la dirección en memoria es m100) y esa dirección de memoria se almacena en el nombre de la variable. Cuando es hora de recuperar el valor del nombre de la variable, el tiempo de ejecución sabrá que su contenido no se encuentra almacenado en la variable en si sino en la ubicación en memoria a la cual apunta la variable.
Æ
Copiar valores y tipos de referencia
UTILICE el proyecto que guardó en el ejercicio anterior.
1. Agregue el siguiente código después de la definición de la clase Rectangle para crear una estructura Point: struct Point { public double X, Y; } Figura 2-1 Visualización de un tipo de valor en memoria Figura 2-2 Visualización de un tipo de referencia en memoria
int number;
number = 10;
10 número 0 númeroProduction note: This figure should be redrawn on a smaller scale. Please also make the arrows as straight lines when you redraw it.
string name; name = "Northwind"; m100 nombre null nombre m100 "Northwind" dirección datos
Vista de Código Vista de Memoria
ETC IBEROÁMERICA
2. Modifique el código del método Main como se muestra a continuación: static void Main(string[] args)
{
Point p1 = new Point(); p1.X = 10;
p1.Y = 20; Point p2 = p1; p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X); Rectangle rect1 = new Rectangle { Length = 10.0, Width = 20.0 };
Rectangle rect2 = rect1; rect2.Length = 100.0;
Console.WriteLine(“rect1.Length = {0}”, rect1.Length);
}
3. Seleccione Depurar y después Iniciar sin depurar. Aparecerá una ventana de consola para mostrar los valores para p1.X y rect1.Length.
4. GUARDE su proyecto.
PAUSA. Deje el proyecto abierto para utilizarlo en el siguiente eje
La primera parte del programa crea una copia del tipo de valor Point y la segunda mitad del programa crea una copia del tipo de referencia Rectangle. Analicemos como se realiza la copia del tipo de valor.
Cuando se ejecuta la siguiente sentencia, se crea una nueva variable p2 en memoria y su contenido se copia desde la variable p1:
Point p2 = p1;
Después de ejecutar esta sentencia, se crea la variable p2 y el contenido de la variable p1 se copia a la variable p2. Tanto p1 como p2 tienen su propio conjunto de valores disponibles en sus ubicaciones en memoria respectivas. Por lo que, cuando se ejecuta la siguiente sentencia:
p2.X = 100;
sólo se afecta el valor de X correspondiente a la ubicación en memoria de la variable p2. El valor de X para la variable p1 permanece sin cambios.
Tome Nota
Es posible crear un struct sin utilizar el operador new. Puede simplemente decir Point p1;
para crear una variable del tipo struct.
Tome Nota
Cuando copia una variable de tipo de referencia a otra variable del mismo tipo, sólo se copian las referencias. Como resultado, después de la copia, las dos variables apuntan al mismo proyecto.
ETC IBEROÁMERICA
Ahora, analicemos cómo funciona la copia entre los tipos de referencia. Cuando se ejecuta la siguiente sentencia, se crea una nueva variable rect2, igual que antes, el contenido de rect1 se copia a la ubicación en memoria de rect2:
Rectangle rect2 = rect1;
Pero puesto que la clase Rectangle es un tipo de referencia, el contenido de la variable rect1 es de hecho una referencia a la ubicación en memoria que contiene un objeto de Rectangle. Así que, después de la inicialización anterior, tanto rect1 y rect2 apuntan a la misma ubicación en memoria y al mismo objeto de Rectangle. Sólo hay un objeto de rectangle en memoria y tanto rect1 como rect2 se referen a él. La siguiente sentencia modifca Length del objeto de rectangle:
rect2.Length = 100.0;
Esta sentencia hace referencia a la ubicación en memoria apuntada por rect2 (la cual resulta ser la misma ubicación en memoria apuntada por rect1) y modifca Length del objeto Rectangle. Ahora, si intenta hacer referencia a la misma ubicación en memoria vía el objeto rect1, obtendrá el objeto modifcado y aparecerá el siguiente código mostrando el valor “rect1.Length = 100”.
Console.WriteLine(“rect1.Length = {0}”, rect1.Length);