¿Guid es todo 0 (ceros)?

Resuelto Didaxis asked hace 13 años • 6 respuestas

Estoy probando algunos servicios WCF que envían objetos con Guids de un lado a otro. En el código de prueba de mi aplicación web, estoy haciendo lo siguiente:

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

Por alguna razón, la llamada a new Guid() genera Guids con ceros como este:

00000000-0000-0000-0000-000000000000

¿Qué podría estar causando esto?

Didaxis avatar Nov 02 '11 02:11 Didaxis
Aceptado

Utilice el método estático Guid.NewGuid()en lugar de llamar al constructor predeterminado.

var responseObject = proxy.CallService(new RequestObject
{
    Data = "misc. data",
    Guid = Guid.NewGuid()
});
Mark Byers avatar Nov 01 '2011 20:11 Mark Byers

Lecciones para aprender de esto:

1) Guid es un tipo de valor, no un tipo de referencia.

2) Llamar al constructor predeterminado new S()en cualquier tipo de valor siempre le devuelve la forma todo cero de ese tipo de valor, sea cual sea. Es lógicamente lo mismo que default(S).

Eric Lippert avatar Nov 01 '2011 20:11 Eric Lippert

Pruebe esto en su lugar:

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

Esto generará un valor Guid "real". Cuando crea un nuevo tipo de referencia, le dará el valor predeterminado (que en este caso, es todo ceros para un Guid).

Cuando crea un nuevo Guid, lo inicializará todo a ceros, que es el valor predeterminado para Guid. Es básicamente lo mismo que crear un int "nuevo" (que es un tipo de valor pero puedes hacerlo de todos modos):

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

Compare esto con hacer lo mismo con un int:

int i1;                     // i1 is 0
int i2 = new int();         // i2 is 0
int i3 = default(int);      // i3 is 0
JohnD avatar Nov 01 '2011 20:11 JohnD