Pregunta

Se crean GUID utilizando el new Palabra clave que me hace pensar que es un tipo de referencia.

¿Es esto correcto?

Guid uid = new Guid();

¿Se almacenan GUIDS en el montón?

¿Fue útil?

Solución

Puede ver la definición de un guía usted mismo:

public struct Guid ...

O puede probarlo así:

bool guidIsValueType = typeof(Guid).IsValueType;

Los GUID se crean utilizando la nueva palabra clave que me hace pensar que es un tipo de referencia.

Las estructuras también pueden tener constructores, por ejemplo new DateTime(2012, 12, 23).

Otros consejos

GUID es un tipo de valor.

Ver MSDN. Tenga en cuenta que GUID es un estructura. Todas las estructuras son Tipos de valor.

Los GUID se crean utilizando la nueva palabra clave que me hace pensar que es un tipo de referencia.

Deja de pensar eso. Los tipos de valor también pueden tener constructores. Es perfectamente legal, aunque extraño, por decir

int x = new int();

Eso es lo mismo que asignar cero a x.

¿Es esto correcto?

No.

¿Se almacenan Guid en Heap?

Sí. Los GUID también se almacenan en la pila.

Tenga en cuenta que el siguiente análisis supone que la implementación de la CLI es el Microsoft "Desktop" o "Silverlight" CLR que se ejecuta en Windows. No tengo idea de qué otras versiones de la CLI hacen, qué hacen en Macs, etc. Si necesita saber si un trozo de memoria particular se almacena en la pila en otras implementaciones, tendrá que preguntarle a alguien que sea un experto en esas implementaciones.

Se almacena un GUID en la pila en las siguientes circunstancias:

(1) Cuando el GUID es un resultado "temporal" de un cálculo continuo o se está utilizando como argumento para un método. Por ejemplo, si tiene una llamada de método m (nueva GUID ()), entonces el almacenamiento temporal para el nuevo GUID se asigna en la pila.

(2) Cuando el GUID es una variable local que (a) no está en un bloque iterador, (b) no es una variable externa cerrada de un método anónimo o expresión de lambda.

En todas las demás situaciones, el GUID no se almacena en la pila. Se almacena un GUID en el montón cuando se trata de un campo de un tipo de referencia, un elemento de una matriz, un local cerrado de un método anónimo o expresión de lambda, o un local en un bloque iterador.

Un GUID también puede almacenarse ni en el montón de GC ni en la pila. Se puede almacenar un GUID en memoria completamente no administrada, a la que se accede a través de la aritmética insegura del puntero.

Tengo curiosidad por saber por qué te importa tanto si los bits de un GUID están en la pila o en el montón. ¿Qué diferencia hace?

En realidad es Guía. Todos los tipos se construyen utilizando el new palabra clave. Puede identificar los tipos de referencia de los tipos de valor por si son un clase, interfaz, o delegar (todos los tipos de referencia), o un estructura o enumer (tipos de valor).

Su tipo de valor, consulte el siguiente ejemplo:

using System;                   
public class Program
{
    public static void Main()
    {
        Guid a1 = new Guid();
        Console.WriteLine(a1);
        Guid b1 = a1;
        Console.WriteLine(b1);
        a1 = Guid.NewGuid();
        Console.WriteLine(a1);
        Console.WriteLine(b1);
    }
}

/* OUTPUT
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
164f599e-d42d-4d97-b390-387e8a80a328
00000000-0000-0000-0000-000000000000
*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top