Guid.NewGuid () vs. new Guid ()

347

¿Cuál es la diferencia entre Guid.NewGuid()y new Guid()?

¿Cuál es el preferido?

OscarRyz
fuente
66
@ClintonWard Soy prácticamente nuevo en C # y @ Bob2Chiv No puedo ejecutar el proyecto en este momento y tenía curiosidad al respecto.
OscarRyz
66
@OscarRyz: para probar rápidamente el código en C #, utilizo LinqPad .
DaveShaw
55
En realidad, creo que esta pregunta es relevante, porque es confusa y realmente no digo "0000000-0000 .." como el mejor valor predeterminado. Me encontré con un problema en el que un cliente no podía iniciar sesión en un sistema porque en algún lugar en el interior del proyecto se llamó a nuevo Guid () en lugar de NewGuid ()
Michiel Cornille
3
@DaveShaw - LinQPad es genial y lo uso mucho. Pero quería señalar que Visual Studio ahora tiene una ventana "C # Interactive" que es muy útil para este tipo de pruebas.
Mark Meuer
1
@MichielCornille Acabo de conocer el sentimiento hermano ...
Jins Peter

Respuestas:

581

new Guid() hace un guid de "0" "vacío" (00000000-0000-0000-0000-000000000000 no es muy útil).

Guid.NewGuid() hace un guid real con un valor único, lo que probablemente quieras.

MarkPflug
fuente
26
Un UUID vacío es realmente muy útil. Tiene un gran valor especial.
Jon Hanna
103
En una nota al margen, new Guid()es equivalente a Guid.Empty.
Steve Guidi
30
@ JonHanna Todos los guías hacen grandes valores especiales. Desafortunadamente, los vacíos tienen una tendencia a colisionar. Sin embargo, estoy de acuerdo en que las guías vacías son útiles, generalmente para indicar que algo no se ha inicializado.
MarkPflug
55
Los vacíos son muy útiles porque chocan. Un valor especial que no colisionó con el valor especial conocido sería inútil.
Jon Hanna
55
Creo que ambos están de acuerdo en que es una buena "guía conocida" para comparar, como en el caso de indicar que algo está esperando la inicialización o está en algún otro estado conocido. Personalmente, preferiría usar un valor nulo, pero puedo ver que alguien podría necesitar un guid "especial" en algún momento, y el guid all-0 es probablemente el guid con menos probabilidades de violar el principio de menor sorpresa para los futuros mantenedores del código
PeterL
37

Guid.NewGuid() crea un nuevo UUID utilizando un algoritmo diseñado para hacer colisiones muy, muy poco probable.

new Guid() crea un UUID que es todo ceros.

En general, preferiría el primero, porque ese es el objetivo de un UUID (a menos que, por supuesto, lo esté recibiendo de otro lugar).

Hay casos en los que realmente desea un UUID todo cero, pero en este caso Guid.Emptyo default(Guid)es más claro acerca de su intención, y hay menos posibilidades de que alguien lo lea esperando que se haya creado un valor único.

En general, new Guid()no es tan útil debido a esta falta de claridad, pero no es posible tener un tipo de valor que no tenga un constructor sin parámetros que devuelva un valor de todos ceros y nulos.

Editar: en realidad, es posible tener un constructor sin parámetros en un tipo de valor que no establece todo en cero y nulo, pero no puede hacerlo en C #, y las reglas sobre cuándo se llamará y cuándo habrá solo ser una estructura de cero creado es confuso, por lo que no es una buena idea de todos modos.

Jon Hanna
fuente
16
Agregaré esto por diversión. Para una probabilidad de colisión del 1%, necesitaría generar aproximadamente 2,600,000,000,000,000,000 GUIDs
Clinton Ward
8
@ClintonWard depende de cuál de los algoritmos UUID esté en uso, pero dado que algunos usan direcciones MAC para evitar colisiones entre máquinas, y todos usan un factor de tiempo para evitar colisiones en la misma máquina, debe crear incluso más que las matemáticas normales podría sugerir. A menos que se joda deliberadamente con el algoritmo cambiando el tiempo y jugando con las direcciones MAC, en cuyo caso debería obtener uno bastante rápido, pero eso es jugar con las entradas deliberadamente.
Jon Hanna
2
Eso fue v1 Guid. los MS GUID más nuevos son V4 y no usan la dirección MAC como parte de la generación de GUID. Sin embargo
el
16

[Entiendo que este es un hilo viejo, solo agregando un poco más de detalle] Las dos respuestas de Mark y Jon Hanna resumen las diferencias, aunque puede interesarles algo que

Guid.NewGuid()

Eventualmente llama a CoCreateGuid (una llamada COM a Ole32) (referencia aquí ) y el trabajo real lo realiza UuidCreate .

Guid.Empty está destinado a usarse para verificar si un Guid contiene todos los ceros. Esto también podría hacerse comparando el valor del Guid en cuestión con el nuevo Guid ()

Entonces, si necesita un identificador único , la respuesta es Guid.NewGuid ()

Sudhanshu Mishra
fuente
-2

Guid.NewGuid(), ya que crea GUID según lo previsto.

Guid.NewGuid() crea un vacío Guid objeto , lo inicializa llamandoCoCreateGuid y devuelve el objeto.

new Guid() simplemente crea un GUID vacío (todos ceros, creo).

Supongo que tuvieron que hacer público el constructor como Guides struct.

Sharath
fuente
55
¿Cuál es el punto de agregar una respuesta que no agrega nada que no exista en las respuestas que han estado aquí por años?
Dinerdo