¿Guid es todo 0 (ceros)?
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?
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()
});
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)
.
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