You are on page 1of 10

OBJETOS EN MEMORIA

Cuando declara una variable en su clase, ya sea en el nivel de clase o en el nivel de


método, asigna espacio de memoria para los datos que se asignarán a la variable. Para
los tipos de valor, es fácil calcular la cantidad de memoria tomada. Por ejemplo, declarar
un int le cuesta cuatro bytes y declararle un long le devuelve ocho bytes. Sin embargo, el
cálculo de las variables de referencia es diferente.

Cuando se ejecuta un programa, se asigna un espacio de memoria para los datos. Este
espacio de datos se divide lógicamente en dos, la pila (stack) y el montón (heap). Los tipos
de valores (value type) se asignan en la pila y los objetos residen en el montón. Cuando
declara un tipo de valor, se asignan unos pocos bytes en la pila. Cuando declara una
variable de referencia, algunos bytes también se reservan en la pila, pero la memoria no
contiene los datos de un objeto, sino que contiene la dirección del objeto en el montón.
En otras palabras, cuando declaras

Book book;

algunos bytes son reservados para una variable de referencia del book. El valor inicial del
book es nulo (null) porque todavía no hay ningún objeto asignado. Cuando escribimos

Book book = new Book();

creamos una instancia (instance) de book, que se almacena en el montón (heap), y asigna
la dirección de la instancia al book de variables de referencia. Una variable de referencia
(reference type) en C# es como un puntero C++, excepto que no se puede manipular una
variable de referencia. En C#, se usa una variable de referencia para acceder al miembro
del objeto (campos o propiedades, métodos y constructores) al que se refiere. Por lo
tanto, si la clase Book tiene un método público llamado Review, puede llamar al método
utilizando esta sintaxis:

book.Review();

Un objeto puede ser referenciado por más de una variable de referencia.

Por ejemplo,

Book myBook = new Book();


Book yourBook = myBook;

La segunda línea copia el valor de myBook en yourBook. Como resultado, yourBook ahora
hace referencia al mismo objeto Book que myBook.
La Figura 4.4 ilustra la asignación de memoria para un objeto Book referenciado por
myBook y yourBook.

Figura 4.6: Un objeto "dentro" de otro objeto


Resulta que el objeto Address no está realmente dentro del objeto Employee. Sin
embargo, la variable de referencia de Address en el objeto Employee hace referencia al
objeto Address, por lo tanto permitiendo que el objeto Employee manipule el objeto
Address. Porque en C# no hay forma de acceder a un objeto excepto a través de una
variable de referencia asignada a la dirección del objeto, nadie más puede acceder al
objeto de Address 'dentro' del objeto Employee.

¡A esto se le llama inyección de dependencia!!!!!!

CATEGORÍAS DE TIPOS

Todos los tipos se dividen en una de dos categorías: tipos de valor (value types)y tipos de
referencia (reference types). Las diferencias entre los tipos en cada categoría se derivan
de cómo se copian: los datos del tipo de valor siempre se copian por valor, mientras que
el tipo de referencia los datos se copian siempre por referencia

Tipos de valor (Value Types)

Con la excepción del tipo cadena (string), todos los tipos predefinidos en el objeto book
hasta el momento han sido tipos de valores. Las variables de tipos de valor contienen el
valor directamente en memoria. En otras palabras, la variable se refiere a la misma
ubicación en la memoria (pila o stack) donde el valor está almacenado Debido a esto,
cuando se asigna una variable diferente el mismo valor, se realiza una copia del valor de
la variable original en la ubicación de la nueva variable (pila o stack). Una segunda variable
del mismo tipo de valor no puede referirse la misma ubicación (pila o stack) en la memoria
como la primera variable. Por consiguiente, cambiar el valor de la primera variable no
afectará el valor en el segunda.

La figura 2.1 demuestra esto. En la figura, el number1 se refiere a una ubicación (pila o
stack)en particular en la memoria que contiene el valor 42. Después de asignar el
number1 al number2, ambas variables contendrán el valor 42. Sin embargo, modificar el
valor de cualquiera de las variables no afectará al otro debido a que son de tipo valor
(value Type) ya que solo se copia el valor y no la dirección de memoria (pila o stack) la
cual son diferentes a diferencia los tipos por referencia (Monton o Heap).
Del mismo modo, pasando un tipo de valor a un método como Console.WriteLine
()también dará como resultado una copia de memoria y cualquier cambio en el
parámetro dentro el método no afectará el valor original dentro de la función de llamada.
Dado que los tipos de valores requieren una copia de memoria, generalmente deben
definirse consumir una pequeña cantidad de memoria; los tipos de valor deberían casi
siempre tener menos de 16 bytes de tamaño.

Tipos de Referencia (Reference Types)

By contrast, the value of a reference type is a reference to a storage location that contains
data. Reference types store the reference where the data is located instead of storing the
data directly, as value types do. Therefore, to access the data, the runtime will read the
memory location out of the variable and then “jump” to the location in memory that
contains the data.

Por el contrario, el valor de un tipo de referencia es una referencia a una ubicación de


almacenamiento que contiene datos. Los tipos de referencia almacenan la referencia
donde se encuentran los datos en lugar de almacenar los datos directamente, como lo
hacen los tipos de valores. Por lo tanto, para acceder a los datos, el tiempo de ejecución
leerá la ubicación de la memoria fuera de la variable y luego "saltará" a la ubicación en la
memoria que contiene los datos.

El área de memoria de los datos a los que apunta un tipo de referencia (Reference
Types)se llama montón (Heap)(ver Figura 2.2). Un tipo de referencia no requiere la misma
copia de memoria de los datos que un tipo de valor, lo que hace que los tipos de
referencia de copia sean mucho más eficientes que la copia de tipos de valores grandes.
Al asignar el valor de una variable de tipo de referencia a otra variable de tipo de
referencia, solo se copia la referencia, no los datos a los que se hace referencia.

En la práctica, una referencia es siempre del mismo tamaño que el tamaño nativo "del
procesador: un procesador de 32 bits copiará una referencia de 32 bits y un procesador
de 64 bits copiará una referencia de 64 bits, y así sucesivamente. Obviamente, copiar la
pequeña referencia a un gran bloque de datos es más rápido que copiar todo el bloque,
como lo haría un tipo de valor. Como los tipos de referencia copian una referencia a los
datos, dos variables diferentes pueden refiérase a los mismos datos. Si dos variables se
refieren al mismo objeto, cambiando
un campo del objeto a través de una variable hace que el efecto se vea cuando acceda al
campo a través de otra variable. Esto sucede tanto para la asignación y para llamadas de
método. Por lo tanto, un método puede afectar los datos de un tipo referencia, y ese
cambio se puede observar cuando el control regresa a la persona que llama. Por esta
razón, un factor clave al elegir entre definir un tipo de referencia o un tipo de valor es si
el objeto es lógicamente como un valor inmutable de tamaño fijo (y por lo tanto
posiblemente un tipo de valor), o lógicamente una cosa mutable a los que se puede hacer
referencia (y, por lo tanto, es probable que sean un tipo de referencia).

Además del tipo cadena (string) y cualquier clase personalizada como Programa, todos
los tipos discutidos hasta ahora son tipos de valores. Sin embargo, la mayoría de los tipos
son tipos de referencia. Aunque es posible definir tipos de valores personalizados, es
relativamente raro hacerlo en comparación con la cantidad de tipos de referencia
personalizados.
VALUE TYPES

Tipos de valores personalizados

Hay dos categorías de tipos de valor personalizado:

 Estructuras
 Enumeraciones

Este capítulo explica cómo las estructuras permiten a los programadores para definir
nuevos tipos de valores que se comporten de manera muy similar a la mayoría de los
tipos predefinidos discutidos en el Capítulo 2. La clave es que cualquier nuevo los tipos
de valores definidos tienen sus propios datos y métodos personalizados. El capítulo
también analiza cómo usar enumeraciones para definir conjuntos de valores constantes.

Value Types

Las variables de los tipos de valores contienen directamente sus valores, como se muestra
en la Figura 8.1. El nombre de la variable está asociado directamente con la ubicación de
almacenamiento en la memoria donde se almacena el valor. Debido a esto, cuando una
segunda variable se le asigna el valor de una variable original, una copia del original el
valor de la variable se realiza en la ubicación de almacenamiento asociada con la segunda
variable. Dos variables nunca se refieren a la misma ubicación de almacenamiento (a
menos que uno o ambos son parámetros out o ref, que son, por definición, alias para otra
variable). Cambiar el valor de la variable original no afectará el valor en la segunda variable,
porque cada variable está asociada a una diferente ubicación de almacenamiento. En
consecuencia, cambiando el valor de una variable de tipo de valor no puede afectar el valor
de cualquier otra variable de tipo de valor.
Una variable de tipo de valor es como una hoja de papel que tiene un número escrito en
eso. Si desea cambiar el número, puede borrarlo y reemplazarlo con un número diferente.
Si tiene una segunda hoja de papel, puede copiar el número del primer pedazo de papel,
pero los dos pedazos de papel son entonces independientes; borrar y reemplazar el
número en uno de ellos no lo hace cambia el otro.

Del mismo modo, pasando una instancia de un tipo de valor a un método como
Console.WriteLine () también dará como resultado una copia de memoria del
almacenamiento ubicación asociada con el argumento de la ubicación de
almacenamiento asociada con el parámetro y cualquier cambio a la variable de
parámetro dentro del método no afectará el valor original dentro de la persona que
llama. Dado que los tipos de valores requieren una copia de memoria, en general se deben
definir para consumir una pequeña cantidad de memoria (típicamente 16 bytes o menos).

Lineamientos:
NO cree tipos de valores que consuman más de 16 bytes de memoria

Los valores de tipo valor suelen ser de corta duración; en muchas situaciones, un valor es
necesario solo para una parte de una expresión o para la activación de un método. En
estos casos, las variables y los valores temporales de los tipos de valor pueden a menudo
almacenarse en el grupo de almacenamiento temporal, llamado "la pila" (Stack). (Esto es
en realidad un nombre inapropiado: no hay ningún requisito que el grupo temporal
asigne su almacenamiento fuera de la pila. De hecho, como detalle de implementación,
con frecuencia elige asignar el almacenamiento de los registros disponibles en su lugar).
El grupo temporal (stack) es menos costoso de limpiar que el recogido de basura montón
(; sin embargo, los tipos de valores tienden a copiarse más que los tipos de referencia, y
esa copia puede imponer un costo de rendimiento propio. No caigas en la trampa de
creer que "los tipos de valor son más rápidos porque pueden asignarse en la pila" (Stack).

Tipos de Referencia (Reference Types)


Por el contrario, el valor de una variable de tipo de referencia (Reference Types) es una
referencia a una instancia (referencia en memoria) de un objeto (ver Figura 8.2). Las
variables de tipo de referencia almacenan referencia (típicamente implementada como
la dirección de memoria) donde los datos para la instancia del objeto se encuentra, en
lugar de almacenar los datos directamente, como variable del tipo de valor hace. Por lo
tanto, para acceder a los datos, el tiempo de ejecución leer la referencia de la variable y
luego desreferenciarla para llegar a la ubicación en la memoria que en realidad contiene
los datos para la instancia.

Una variable de tipo de referencia, por lo tanto, tiene dos ubicaciones de


almacenamiento asociadas con ella:
 La ubicación de almacenamiento asociada directamente con la variable
(dirección).
 La ubicación de almacenamiento a la que hace referencia la referencia que es el
valor almacenado en la variable (valor).

Una variable de tipo de referencia es, una vez más, como una hoja de papel que siempre
tiene algo escrito en élla. Imagine un pedazo de papel que tiene una dirección de la casa
(referencia)escrito en él, por ejemplo, "123 Sesame Street, New York City". La pieza de
papel es una variable; la dirección es una referencia a un edificio. Ni el papel ni la dirección
escrita en él es el edificio, y la ubicación del papel no necesita tener nada que ver con la
ubicación del edificio al que se refieren sus contenidos. Si hace una copia de esa
referencia en otra hoja de papel, el contenido de ambas hojas de papel se refiere al
mismo edificio. Si luego pintas ese edificio de color verde, se puede observar que el
edificio al que se refieren ambas hojas de papel es verde, porque las referencias se
refieren a lo mismo.

La ubicación de almacenamiento asociada directamente con la variable (o de valor


temporal) no se trata de manera diferente a la ubicación de almacenamiento asociada
con un variable de tipo de valor: si se sabe que la variable es efímera, se asigna en el
grupo de almacenamiento a corto plazo. El valor de una variable de tipo de referencia
siempre es una referencia a una ubicación de almacenamiento en el montón recogido o
basura nula (Heap); en definitiva las variables de referencia son temporales.

Comparado con una variable de tipo de valor, que almacena los datos de la instancia
directamente, el acceso a los datos asociados con una referencia implica un extra "Salto":

Primero, la referencia debe desreferenciarse para encontrar la ubicación de


almacenamiento de los datos reales, y luego los datos pueden leerse o escribirse. Al
copiar un valor de tipo de referencia, solo se copia la referencia, que es pequeña. (Se
garantiza que una referencia no será mayor que el "tamaño de bit" del procesador, una
máquina de 32 bits tiene referencias de 4 bytes, una máquina de 64 bits tiene referencias
de 8 bytes, etc.) Copiando el valor de un tipo de valor copia todos los datos, que podrían
ser grandes. Por lo tanto, en algunas circunstancias, los tipos de referencia son más
eficientes para copiar. Esta es la razón por la cual la guía para los tipos de valores es para
garantizar que nunca sean más de 16 bytes o menos; si un tipo de valor es más de cuatro
veces más caro de copiar como referencia, probablemente debería ser simplemente un
tipo de referencia.

Since reference types copy only a reference to the data, two different variables can refer
to the same data. In such a case, changing the data through one variable will be observed
to change the data for the other variable as well. This happens both for assignments and
for method calls. To continue our previous analogy, if you pass the address of a building
to a method, you make a copy of the paper containing the reference and hand the copy
to the method. The method cannot change the contents of the original paper to refer to
a different building. If the method paints the referred-to building, however, when the
method returns, the caller can observe that the building to which the caller is still
referring is now a different color.

Como los tipos de referencia copian solo una referencia a los datos, dos variables diferentes
puede referirse a los mismos datos. En tal caso, cambiando los datos a través de se
observará una variable para cambiar los datos de la otra variable como bien. Esto sucede
tanto para las asignaciones como para las llamadas a métodos.

Para continuar nuestra analogía anterior, si pasas la dirección de un edificio a un método,


usted hace una copia del papel que contiene la referencia y la mano la copia al método.
El método no puede cambiar el contenido del original papel para referirse a un edificio
diferente. Si el método pinta lo referido a sin embargo, cuando el método retorna, la
persona que llama puede observar que La construcción a la que el que llama todavía se
refiere es ahora de un color diferente.

You might also like