Je teste certains services WCF qui envoient des objets avec des allers-retours. Dans mon code de test d'application web, je fais ce qui suit:
var responseObject = proxy.CallService(new RequestObject
{
Data = "misc. data",
Guid = new Guid()
});
Pour une raison quelconque, l'appel à new Guid () génère des guides avec tous les 0 (zéros) comme ceci:
00000000-0000-0000-0000-000000000000
Qu'est-ce qui peut causer cela?
Guid.Empty
Réponses:
Utilisez la méthode statique
Guid.NewGuid()
au lieu d'appeler le constructeur par défaut.la source
Leçons à en tirer:
1) Guid est un type de valeur, pas un type de référence.
2) L'appel du constructeur par défaut
new S()
sur n'importe quel type de valeur vous renvoie toujours la forme entièrement nulle de ce type de valeur, quelle qu'elle soit. C'est logiquement le même quedefault(S)
.la source
default(S)
ou y a-t-il des subtilités qui me manquent?const int x = new int();
n'est pas censé être légal selon la spécification, mais l'const int x = default(int);
est; nous autorisons les deux.Essayez plutôt ceci:
Cela générera une «vraie» valeur Guid. Lorsque vous créez un type de référence, il vous donnera la valeur par défaut (qui dans ce cas, est tous des zéros pour un Guid).
Lorsque vous créez un nouveau Guid, il l'initialise à tous les zéros, ce qui est la valeur par défaut de Guid. C'est fondamentalement la même chose que de créer un "nouveau" int (qui est un type de valeur mais vous pouvez le faire quand même):
Comparez cela à la même chose avec un int:
la source
g1
compilera uniquement en tant que champ et non en tant que variable locale. De plus, les indices dans votre colonne de commentaires ne correspondent pas à la même ligne du codeEssayez de faire:
la source
Je ne peux pas vous dire combien de fois cela s'est produit. moi.
la source
Dans l'esprit d'être complet, les réponses qui vous demandent d'utiliser
Guid.NewGuid()
sont correctes.Pour traiter votre modification ultérieure, vous devrez publier le code de votre
RequestObject
classe. Je soupçonne que votre propriété guid n'est pas marquée comme unDataMember
, et n'est donc pas sérialisée sur le fil. Puisquedefault(Guid)
c'est la même chosenew Guid()
(c'est-à-dire tous0
), cela expliquerait le comportement que vous voyez.la source