2011-12-29 10 views
8

Duplicar posibles:
Are automatically generated GUIDs for types in .NET consistent?¿Type.GUID identifica de forma única cada tipo en las compilaciones?

quiero usar Type como un diccionario clave, pero yo prefiero usar cualquier nombre de tipo completo o Type.GUID. ¿Qué tan confiable y correcto es Type.GUID para esta tarea?

Ayende Rahien escribe:

puede confiar en System.Type.GUID ser estable?

Por estable quiero decir que generará el mismo valor para el mismo tipo en las compilaciones. La evidencia empírica sugiere que este es el caso, con los siguientes factores para determinar el GUID de un tipo:

  • Nombre de tipo (incluyendo el espacio de nombres)
  • nombre de Asamblea
  • Asamblea clave pública

Reflejando en el sistema, resulta que System.Type.GUID es eventualmente traducido a una llamada a System.RuntimeType.GetGUID, esto es uno de los métodos de InternallCall miedo que se implementan directamente en el tiempo de ejecución en sí.

Me pregunto ...

Respuesta

4

De la documentación en http://msdn.microsoft.com/en-us/library/system.type.guid.aspx.

El propósito de Type.GUID es obtener el valor asociado con la clase usando [Guid("...")]. Sin embargo, también devuelve un guid cuando este atributo no está asociado. El problema es de dónde saca esto. Una pequeña prueba muestra que el guid es estable. Comprobé el guid de una clase, y verifiqué que cambió cuando cambié el nombre de la clase. Cuando cambié el nombre de la clase, obtuve el guid original nuevamente. Sin embargo, dado que estos guids aparecen de la nada, no se debe confiar en que sean estables en el tiempo, versiones, versiones de frameworks, etc.

1

creo que no crea problema usando Type.GUID como una clave para su diccionario. si Guid no es confiable, la mayoría del componente COM no habría funcionado.

+0

¿Puedes indicar una fuente que confirme esto? – Oded

3

No lo uses.

typeof(byte).GUID 
00000000-0000-0000-0000-000000000000 

typeof(int).GUID 
00000000-0000-0000-0000-000000000000 

typeof(short).GUID 
00000000-0000-0000-0000-000000000000 

Probado en ideone.com, corren Mono 2.8

EDIT: después de usar System.Reflection en varios montajes (grandes) no pude encontrar una colisión entre dos GUID. Entonces parece que el problema 0-GUID es Mono-específico.

+0

¿En qué condiciones? ¿Qué versión de CLR? En mi caso (.NET 4 usando LINQpad) obtengo resultados distintos de cero, pero diferentes entre programas se ejecutan. –

+0

Obtengo no ceros también (.Net 4, aplicación de consola simple). – ken2k

+0

¿Por qué tengo diferentes GUID? ¿Cómo obtuviste todos los ceros? –

2

Type.FullName o Type.AssemblyQualifiedName están bien para sus necesidades. También simplificará mucho la depuración en comparación con los GUID (nombre de tipo significativo en comparación con un GUID desconocido).

Otro punto es que la propiedad GUID no parece estar bien documentada, por lo que no confiaría en ella.

EDIT: también podría utilizar la instancia Type como la clave.

1

Debe compilar el diccionario dinámicamente, buscar el GUID cada vez o establecer el GUID estáticamente con la clase GuidAttribute. Nunca debe confiar en un comportamiento que no está garantizado.

Cuestiones relacionadas