Testuję niektóre usługi WCF, które wysyłają obiekty z Guidami tam iz powrotem. W moim kodzie testowym aplikacji internetowej wykonuję następujące czynności:
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid()
});
Z jakiegoś powodu wywołanie new Guid () generuje Guids ze wszystkimi zerami (0) w następujący sposób:
00000000-0000-0000-0000-000000000000
Co może być tego przyczyną?
Guid.Empty
Odpowiedzi:
Użyj metody statycznej
Guid.NewGuid()
zamiast wywoływania domyślnego konstruktora.źródło
Wnioski z tego wynikające:
1) Guid jest typem wartości, a nie typem odniesienia.
2) Wywołanie domyślnego konstruktora
new S()
dla dowolnego typu wartości zawsze daje z powrotem postać zerową tego typu wartości, niezależnie od tego, co to jest. Jest logicznie taki sam jakdefault(S)
.źródło
default(S)
czy brakuje mi subtelności?const int x = new int();
nie powinien być zgodny ze specyfikacją, aleconst int x = default(int);
jest; pozwalamy na jedno i drugie.Spróbuj zamiast tego:
To wygeneruje „prawdziwą” wartość Guid. Kiedy nowy typ referencji, da ci wartość domyślną (która w tym przypadku to wszystkie zera dla Guida).
Kiedy utworzysz nowego Guida, zainicjuje go on do wszystkich zer, co jest wartością domyślną dla Guida. Jest to w zasadzie to samo, co tworzenie „nowego” int (który jest typem wartości, ale możesz to zrobić mimo to):
Porównaj to do robienia tego samego z int:
źródło
g1
skompiluje się tylko jako zmienna pola, a nie jako zmienna lokalna. Również indeksy w kolumnie komentarza nie pasują do tego samego wiersza koduSpróbuj zrobić:
źródło
Nie mogę powiedzieć, ile razy to się złapało. mnie.
źródło
W duchu kompletności odpowiedzi, które instruują cię do użycia,
Guid.NewGuid()
są poprawne.W odpowiedzi na kolejną edycję musisz opublikować kod swojej
RequestObject
klasy. Podejrzewam, że twoja właściwość GUID nie jest oznaczona jakoDataMember
, a zatem nie jest serializowana przez sieć . Ponieważdefault(Guid)
jest to to samo conew Guid()
(tzn. Wszystkie0
), to wyjaśniałoby zachowanie, które widzisz.źródło