2011-12-29 12 views
8

Eventuali duplicati:
Are automatically generated GUIDs for types in .NET consistent?Does.GUID identifica in modo univoco ogni tipo tra le compilation?

voglio usare Type come un dizionario chiave, ma io preferisco usare entrambi i nome di tipo completo o Type.GUID. Quanto è affidabile e corretto Type.GUID per questa attività?

Ayende Rahien scrive:

può contare su System.Type.GUID per essere stabile?

Per stabile intendo che genererà lo stesso valore per lo stesso tipo attraverso le compilation. L'evidenza empirica suggeriscono che questo è il caso, con i seguenti fattori per determinare il GUID del tipo:

  • nome tipo (compreso lo spazio dei nomi)
  • nome dell'Assemblea
  • Assemblea pubblica chiave

Reflectoring nel sistema, si scopre che System.Type.GUID è eventualmente tradotto in una chiamata a System.RuntimeType.GetGUID, questo è uno dei metodo InternallCall paura che vengono attuati direttamente in il runtime stesso.

mi chiedo ...

risposta

4

Dalla documentazione allo http://msdn.microsoft.com/en-us/library/system.type.guid.aspx.

Lo scopo di Type.GUID è ottenere il valore associato alla classe utilizzando [Guid("...")]. Tuttavia, restituisce anche un guid quando questo attributo non è associato. Il problema è dove arriva questo. Un piccolo test mostra che il guid è stabile. Ho controllato il guid di una classe e ho verificato che fosse cambiato quando ho rinominato la classe. Quando ho rinominato la classe, ho ricevuto di nuovo la guida originale. Tuttavia, dal momento che questi guidi appaiono dal nulla, non dovrebbero essere attendibili per essere stabile nel tempo, versioni, versioni framework, ecc.

1

penso che non crea problema utilizzando Type.GUID come chiave per il dizionario. se Guid non è affidabile, la maggior parte del componente COM non avrebbe funzionato.

+0

Puoi indicare una fonte che conferma questo? – Oded

3

Non utilizzare.

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

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

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

Testato su ideone.com, corrono Mono 2.8

EDIT: dopo aver utilizzato System.Reflection su diverse (grandi) assemblee non riuscivo a trovare una collisione tra due GUID. Quindi sembra il problema 0-GUID è Mono-specifico.

+0

In quali condizioni? Quale versione CLR? Nel mio caso (.NET 4 usando LINQpad) ottengo risultati diversi da zero, ma diverse esecuzioni del programma. –

+0

Anche io ottengo zero (.Net 4, semplice app per console). – ken2k

+0

Perché ho ricevuto GUID diversi? Come hai ottenuto tutti gli zeri? –

2

Type.FullName o Type.AssemblyQualifiedName sono OK per le vostre esigenze. Inoltre semplificherà il debugging molto rispetto ai GUID (nome significativo del tipo rispetto al GUID sconosciuto).

Un altro punto è che la proprietà GUID non sembra essere ben documentata, quindi non ci farei affidamento.

MODIFICA: è inoltre possibile utilizzare l'istanza Type come chiave.

1

È necessario creare il dizionario in modo dinamico, cercando ogni volta il GUID oppure impostare il GUID in modo statico, con la classe GuidAttribute. Non dovresti mai fare affidamento su comportamenti che non sono garantiti.

Problemi correlati