@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.
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.
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 ()
Respuestas:
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.fuente
new Guid()
es equivalente aGuid.Empty
.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.Empty
odefault(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.
fuente
[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
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 ()
fuente
Guid.NewGuid()
, ya que crea GUID según lo previsto.Guid.NewGuid()
crea un vacíoGuid
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
Guid
esstruct
.fuente