web-dev-qa-db-fra.com

Guid est tous les 0 (zéros)?

Je teste certains services WCF qui envoient des objets avec des Guids. Dans mon code de test d'application Web, je procède comme 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 Guids avec tous les 0 (zéros) comme ceci:

00000000-0000-0000-0000-000000000000

Qu'est-ce qui peut causer cela?

218
Didaxis

Utilisez la méthode statique Guid.NewGuid() au lieu d'appeler le constructeur par défaut.

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = Guid.NewGuid()
});
396
Mark Byers

Leçons à tirer de ceci:

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 tout type de valeur vous restitue toujours la forme tout à zéro de ce type de valeur, quel qu'il soit. Il est logiquement identique à default(S).

105
Eric Lippert

Essayez ceci à la place:

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = new Guid.NewGuid()
});

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 (ce qui, dans ce cas, correspond à zéro pour un Guid).

Lorsque vous créez un nouveau Guid, il sera initialisé à tous les zéros, ce qui correspond à 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):

Guid g1;                    // g1 is 00000000-0000-0000-0000-000000000000
Guid g2 = new Guid();       // g2 is 00000000-0000-0000-0000-000000000000
Guid g3 = default(Guid);    // g3 is 00000000-0000-0000-0000-000000000000
Guid g4 = Guid.NewGuid();   // g4 is not all zeroes

Comparez cela à faire la même chose avec un int:

int i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0
55
JohnD

Essayez de faire:

Guid foo = Guid.NewGuid();
20
Dylan Smith

Je ne peux pas vous dire combien de fois cela a été pris. moi.

Guid myGuid = Guid.NewGuid(); 
18
Matt Dawdy

Dans l’esprit d’être complet, les réponses qui vous demandent d’utiliser Guid.NewGuid() sont correctes.

En adressant votre édition ultérieure, vous devrez poster le code pour votre classe RequestObject. Je soupçonne que votre propriété guid n'est pas marquée en tant que DataMember et qu'elle n'est donc pas sérialisée sur le réseau. Puisque default(Guid) est identique à new Guid() (c'est-à-dire à tous les 0]), cela expliquerait le comportement observé.

10
Adam Robinson