2010-02-26 14 views

Respuesta

27

Se puede ver la definición de un GUID mismo:

public struct Guid ... 

O puede probar de esta manera:

bool guidIsValueType = typeof(Guid).IsValueType; 

de GUID se crean usando el nuevo palabra clave que me hace pensar es un tipo de referencia .

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

+0

No, es un tipo de valor -> ver la respuesta de @ Randolpho – CodingYourLife

30

Guid es un tipo de valor.

Ver MSDN. Tenga en cuenta que Guid es un struct. Todas las estructuras son Value Types.

+4

Excepto por supuesto para System.ValueType que de hecho es una clase :) – JaredPar

+1

@JaredPar: Es cierto, pero también es abstracto, por lo que no hay peligro de creación de instancias. – Randolpho

5

En realidad es Guid. Todos los tipos se construyen utilizando la palabra clave new. Puede identificar los tipos de referencia de los tipos de valores por si son class, interface o delegate (todos los tipos de referencia), o struct o enum (tipos de valor).

+4

Es posible que desee agregar enumeración a su lista de tipos de valores. –

15

Los GUID se crean con 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?

Nope.

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

Sí. Las guías también se almacenan en la pila.

Tenga en cuenta que el análisis siguiente asume que la implementación de la CLI es la CLR de Microsoft "desktop" o "Silverlight" que se ejecuta en Windows. No tengo idea de qué otras versiones de la CLI hacen, qué hacen en Mac, y así sucesivamente.Si necesita saber si un trozo de memoria particular está almacenado en la pila en otras implementaciones, tendrá que preguntarle a alguien que sea 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 está siendo utilizado como un argumento a 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 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 una expresión lambda, o un local en un bloque iterador.

Un Guid tampoco se puede almacenar ni en el montón del GC ni en la pila. Un Guid puede almacenarse en una memoria totalmente no administrada, a la que se accede mediante una aritmética de puntero insegura.

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

+0

bueno, ahora que está claro que GUID puede almacenarse en cualquier lugar, supongo que no importaría. – SoftwareGeek

+0

Cuando se escriben aplicaciones en tiempo real (animación, juegos, algunos trabajos de IU), a menudo es necesario reducir, amortizar o eliminar las asignaciones de GC dentro de un "ciclo" específico o iteración del software. Al hacerlo, se reducen o eliminan las colecciones de GC dentro de esos bucles, que causan "enganches" de animación que son visibles para el usuario. Por lo tanto, saber si una determinada línea de código "allocs" es necesaria para decidir cuándo almacenar en caché los objetos o utilizar la agrupación de objetos. Ejemplo: las simulaciones de física lisas en tiempo real escritas completamente en C# no deben asignarse en las fases de colisión o integración. –

Cuestiones relacionadas