2011-12-29 13 views
8

Powiel możliwe:
Are automatically generated GUIDs for types in .NET consistent?Czy Type.GUID jednoznacznie identyfikuje każdy typ w kompilacjach?

chcę użyć Type jako kluczowy słownika, ale wolałbym użyć pełnej nazwy typu lub Type.GUID. Jak niezawodne i poprawne jest dla tego zadania Type.GUID?

Ayende Rahien pisze:

można polegać na System.Type.GUID być stabilny?

Przez stabilność mam na myśli to, że generuje tę samą wartość dla tego samego typu w różnych kompilacjach. Dowody empiryczne wskazują, że jest to przypadek, z następującymi czynnikami determinującymi GUID typu:

  • nazwa typu (w tym nazw)
  • nazwą Zgromadzenie
  • zgromadzenia publicznego klucza

Odzwierciedlając w systemie, okazuje się, że System.Type.GUID jest ostatecznie przetłumaczone na wywołanie System.RuntimeType.GetGUID, to jest jedną ze strasznych metod InternallCall, które są zaimplementowane bezpośrednio w sam system operacyjny.

zastanawiam ...

Odpowiedz

4

Z dokumentacji pod numerem http://msdn.microsoft.com/en-us/library/system.type.guid.aspx.

Celem Type.GUID jest uzyskanie wartości związanej z klasą przy użyciu [Guid("...")]. Jednak zwraca również identyfikator, gdy ten atrybut nie jest powiązany. Problem polega na tym, skąd to bierze. Mały test pokazuje, że guid jest stabilny. Sprawdziłem identyfikator klasy i zweryfikowałem, że zmieniło się, gdy zmieniłem nazwę klasy. Kiedy zmieniłem nazwę klasy z powrotem, otrzymałem oryginalny Guid ponownie. Jednak ponieważ te guidy są wyświetlane z cienkiego powietrza, nie należy im ufać, że są stabilne w czasie, wydania, wersje szkieletowe itp.

1

myślę, że nie stwarza problemów przy Type.GUID jako klucz do słownika. jeśli Guid nie jest wiarygodny, niż większość komponentu COM nie zadziałałaby.

+0

Czy możesz wskazać źródło potwierdzające to? – Oded

3

Nie używaj go.

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

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

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

Testowane na ideone.com, biegną Mono 2.8

EDIT: po użyciu System.Reflection na różnych zespołów (duży) nie mogłem znaleźć kolizji pomiędzy dwoma GUID. Tak więc wydaje się problem 0-GUID jest specyficzny dla Mono.

+0

Na jakich warunkach? Jaką wersję CLR? W moim przypadku (.NET 4 przy użyciu LINQpad) otrzymuję niezerowe wyniki, ale różne w różnych przebiegach programu. –

+0

Też uzyskuję wartości zerowe (.Net 4, prosta aplikacja konsolowa). – ken2k

+0

Dlaczego mam różne identyfikatory GUID? Jak otrzymałeś wszystkie zera? –

2

Type.FullName lub Type.AssemblyQualifiedName są w porządku dla twoich potrzeb. Ponadto znacznie uprości debugowanie w porównaniu do GUID (znacząca nazwa typu w porównaniu do nieznanego identyfikatora GUID).

Inną kwestią jest właściwość GUID, która nie wydaje się być dobrze udokumentowana, więc nie będę na niej polegać.

EDIT: można również użyć instancji Type jako klucza.

1

Powinieneś albo dynamicznie budować słownik, szukając GUID za każdym razem, albo ustawić GUID statycznie, z klasą GuidAttribute. Nigdy nie powinieneś polegać na zachowaniach, które nie są gwarantowane.

Powiązane problemy