.NET Framework
Apilar y Montar
Buscar..
Observaciones
Vale la pena señalar que al declarar un tipo de referencia, su valor inicial será null
. Esto se debe a que aún no apunta a una ubicación en la memoria, y es un estado perfectamente válido.
Sin embargo, con la excepción de los tipos anulables, los tipos de valor normalmente siempre deben tener un valor.
Tipos de valor en uso
Los tipos de valor simplemente contienen un valor .
Todos los tipos de valor se derivan de la clase System.ValueType , y esto incluye la mayoría de los tipos integrados.
Al crear un nuevo tipo de valor, se utiliza el área de memoria denominada pila .
La pila crecerá en consecuencia, según el tamaño del tipo declarado. Así, por ejemplo, a un int siempre se le asignarán 32 bits de memoria en la pila. Cuando el tipo de valor ya no está en el alcance, el espacio en la pila se desasignará.
El siguiente código muestra un tipo de valor que se asigna a una nueva variable. Se está utilizando una estructura como una forma conveniente de crear un tipo de valor personalizado (la clase System.ValueType no se puede ampliar de otra manera).
Lo importante a entender es que al asignar un tipo de valor, el valor se copia a la nueva variable, lo que significa que tenemos dos instancias distintas del objeto, que no pueden afectarse entre sí.
struct PersonAsValueType
{
public string Name;
}
class Program
{
static void Main()
{
PersonAsValueType personA;
personA.Name = "Bob";
var personB = personA;
personA.Name = "Linda";
Console.WriteLine( // Outputs 'False' - because
object.ReferenceEquals( // personA and personB are referencing
personA, // different areas of memory
personB));
Console.WriteLine(personA.Name); // Outputs 'Linda'
Console.WriteLine(personB.Name); // Outputs 'Bob'
}
}
Tipos de referencia en uso
Los tipos de referencia se componen de una referencia a un área de memoria y un valor almacenado dentro de esa área.
Esto es análogo a los punteros en C / C ++.
Todos los tipos de referencia se almacenan en lo que se conoce como el montón .
El montón es simplemente un área gestionada de memoria donde se almacenan los objetos. Cuando se crea una instancia de un nuevo objeto, una parte del montón se asignará para su uso por ese objeto, y se devolverá una referencia a esa ubicación del montón. El montón es administrado y mantenido por el recolector de basura , y no permite la intervención manual.
Además del espacio de memoria requerido para la instancia en sí, se requiere espacio adicional para almacenar la referencia en sí, junto con la información temporal adicional requerida por el CLR de .NET.
El siguiente código muestra un tipo de referencia que se asigna a una nueva variable. En este caso, estamos usando una clase, todas las clases son tipos de referencia (incluso si son estáticas).
Cuando se asigna un tipo de referencia a otra variable, es la referencia al objeto que se copia, no el valor en sí. Esta es una distinción importante entre los tipos de valor y los tipos de referencia.
Las implicaciones de esto son que ahora tenemos dos referencias al mismo objeto.
Cualquier cambio en los valores dentro de ese objeto será reflejado por ambas variables.
class PersonAsReferenceType
{
public string Name;
}
class Program
{
static void Main()
{
PersonAsReferenceType personA;
personA = new PersonAsReferenceType { Name = "Bob" };
var personB = personA;
personA.Name = "Linda";
Console.WriteLine( // Outputs 'True' - because
object.ReferenceEquals( // personA and personB are referencing
personA, // the *same* memory location
personB));
Console.WriteLine(personA.Name); // Outputs 'Linda'
Console.WriteLine(personB.Name); // Outputs 'Linda'
}