Ich teste einige WCF-Dienste, die Objekte mit Guids hin und her senden. In meinem Web-App-Testcode mache ich Folgendes:
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid()
});
Aus irgendeinem Grund generiert der Aufruf von new Guid () Guids mit allen Nullen (Nullen) wie folgt:
00000000-0000-0000-0000-000000000000
Was könnte das verursachen?
Guid.Empty
Antworten:
Verwenden Sie die statische Methode,
Guid.NewGuid()
anstatt den Standardkonstruktor aufzurufen.quelle
Lehren daraus:
1) Guid ist ein Werttyp, kein Referenztyp.
2) Wenn Sie den Standardkonstruktor
new S()
für einen beliebigen Werttyp aufrufen, erhalten Sie immer die Nullform dieses Werttyps zurück, unabhängig davon, um welchen Wert es sich handelt. Es ist logisch dasselbe wiedefault(S)
.quelle
default(S)
oder fehlen mir Feinheiten?const int x = new int();
soll laut Spezifikation nicht legal sein, ist es aberconst int x = default(int);
; wir erlauben beides.Versuchen Sie stattdessen Folgendes:
Dies erzeugt einen "echten" Guid-Wert. Wenn Sie einen Referenztyp neu erstellen, erhalten Sie den Standardwert (in diesem Fall alle Nullen für eine Guid).
Wenn Sie eine neue Guid erstellen, wird sie mit allen Nullen initialisiert. Dies ist der Standardwert für Guid. Es ist im Grunde dasselbe wie das Erstellen eines "neuen" Int (was ein Werttyp ist, aber Sie können dies trotzdem tun):
Vergleichen Sie dies damit, dass Sie dasselbe mit einem int tun:
quelle
g1
wird nur als Feld und nicht als lokale Variable kompiliert. Auch die Indizes in Ihrer Kommentarspalte stimmen nicht mit der gleichen CodezeileVersuchen Sie Folgendes:
quelle
Ich kann dir nicht sagen, wie oft das gefangen hat. mich.
quelle
Im Sinne der Vollständigkeit sind die Antworten, die Sie anweisen,
Guid.NewGuid()
richtig zu sein.Um Ihre nachfolgende Bearbeitung zu adressieren, müssen Sie den Code für Ihre
RequestObject
Klasse veröffentlichen. Ich vermute, dass Ihre Guid-Eigenschaft nicht als gekennzeichnetDataMember
ist und daher nicht über das Kabel serialisiert wird. Da diesdefault(Guid)
dasselbe ist wienew Guid()
(dh alle0
), würde dies das Verhalten erklären, das Sie sehen.quelle