tag must most keywords have google description adwords c# .net guid value-type reference-type

c# - must - ¿Se considera Guid un tipo de valor o tipo de referencia?



must have meta tags (6)

Las guías se crean utilizando la new palabra clave, lo que me hace pensar que es un tipo de referencia.

¿Es esto correcto?

Guid uid = new Guid();

¿Guids se almacenan en el montón?


Los GUID se crean utilizando la nueva palabra clave, lo 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, decir

int x = new int();

Eso es lo mismo que asignar cero a x.

¿Es esto correcto?

No

¿Los GUID están almacenados en el montón?

Sí. Guids también se almacenan en la pila.

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

Un Guid se almacena en la pila en las siguientes circunstancias:

(1) cuando el Guid es un resultado "temporal" de un cálculo en curso o se usa como argumento de un método. Por ejemplo, si tiene un método, llame a M (nuevo 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 lambda.

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

Un Guid también puede almacenarse en el montón GC ni en el stack. Un Guid puede almacenarse en una memoria completamente no administrada, a la que se accede mediante una aritmética de punteros insegura.

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


En realidad es MSDN . Todos los tipos se construyen utilizando la new palabra clave. Puede identificar los tipos de referencia de los tipos de valor ya sea una class , una interface o un delegate (todos los tipos de referencia), o una struct o enum (tipos de valor).


Es un tipo de valor.

MSDN


Guid es un tipo de valor.

Ver MSDN . Tenga en cuenta que Guid es una struct . Todas las estructuras son tipos de valor .


Puedes ver la definición de un Guid tu mismo:

public struct Guid ...

O puedes probarlo así:

bool guidIsValueType = typeof(Guid).IsValueType;

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

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


Su tipo de valor, ver 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 */