Guid.NewGuid () vs new Guid ()

347

Quelle est la différence entre Guid.NewGuid()et new Guid()?

Lequel est préféré?

OscarRyz
la source
6
@ClintonWard Je suis pratiquement nouveau sur C # et @ Bob2Chiv Je ne peux pas exécuter le projet en ce moment et j'étais curieux à ce sujet.
OscarRyz
6
@OscarRyz - Pour tester rapidement le code en C #, j'utilise LinqPad .
DaveShaw
5
En fait, je crois que cette question est pertinente, car elle prête à confusion et je n'ai pas vraiment "0000000-0000 .." comme le meilleur défaut. Je viens de rencontrer un problème où un client ne pouvait pas se connecter à un système car quelque part au fond du projet, un nouveau Guid () a été appelé au lieu de NewGuid ()
Michiel Cornille
3
@DaveShaw - LinQPad est génial et je l'utilise beaucoup. Mais je voulais souligner que Visual Studio a maintenant une fenêtre "C # Interactive" qui est très utile pour ce genre de tests.
Mark Meuer
1
@MichielCornille Je viens de connaître le sentiment frère ...
Jins Peter

Réponses:

581

new Guid() fait un guid "0" tout vide (00000000-0000-0000-0000-000000000000 n'est pas très utile).

Guid.NewGuid() fait un guide réel avec une valeur unique, ce que vous voulez probablement.

MarkPflug
la source
26
Un UUID vide est en effet très utile. Cela fait une grande valeur spéciale.
Jon Hanna
103
D'un côté, new Guid()est équivalent à Guid.Empty.
Steve Guidi
30
@JonHanna Tous les guides font de grandes valeurs spéciales. Malheureusement, les vides ont tendance à entrer en collision. Je suis d'accord pour dire que les guides vides sont utiles, généralement pour indiquer que quelque chose n'est pas initialisé.
MarkPflug
5
Les vides sont très utiles car ils entrent en collision. Une valeur spéciale qui n'entre pas en collision avec la valeur spéciale connue serait inutile.
Jon Hanna
5
Je pense que vous êtes tous les deux d'accord pour dire que cela fait un bon "guide connu" à comparer, comme dans le cas d'indiquer quelque chose en attente d'initialisation ou dans un autre état connu. Personnellement, je préférerais utiliser une valeur nulle, mais je peux voir que quelqu'un pourrait avoir besoin d'un guid "spécial" à un moment donné, et le guid all-0 est probablement le guid le moins susceptible de violer le principe de la moindre surprise pour les futurs responsables du code.
PeterL
37

Guid.NewGuid() crée un nouvel UUID à l'aide d'un algorithme conçu pour rendre les collisions très, très improbables.

new Guid() crée un UUID entièrement composé de zéros.

En général, vous préféreriez le premier, car c'est le but d'un UUID (à moins que vous ne le receviez d'un autre endroit bien sûr).

Il y a des cas où vous voulez en effet un UUID entièrement nul, mais dans ce cas Guid.Emptyou default(Guid)est plus clair sur votre intention, et il y a moins de chance que quelqu'un le lise s'attendant à ce qu'une valeur unique ait été créée.

Dans l'ensemble, new Guid()n'est-ce pas utile en raison de ce manque de clarté, mais il n'est pas possible d'avoir un type de valeur qui n'a pas de constructeur sans paramètre qui retourne une valeur tout à zéro et null.

Edit: En fait, il est possible d'avoir un constructeur sans paramètre sur un type de valeur qui ne met pas tout à zéro et à null, mais vous ne pouvez pas le faire en C #, et les règles sur quand il sera appelé et quand il y aura être une structure entièrement nulle crée de la confusion, donc ce n'est pas une bonne idée de toute façon.

Jon Hanna
la source
16
Je vais ajouter ça pour le plaisir. Pour une probabilité de collision de 1%, vous devez générer environ 2 600 000 000 000 000 000 de GUID
Clinton Ward
8
@ClintonWard, cela dépend des algorithmes UUID utilisés, mais comme certains utilisent des adresses MAC pour éviter les collisions entre machines, et tous utilisent un facteur de temps pour éviter les collisions sur la même machine, vous devez créer encore plus que les calculs normaux suggérerait. Sauf si vous visez délibérément l'algorithme en modifiant l'heure et en jouant avec les adresses MAC, auquel cas vous devriez en obtenir une assez rapidement - mais c'est délibérément jouer avec les entrées.
Jon Hanna
2
C'était v1 Guid. les nouveaux GUID MS sont V4 et n'utilisent pas l'adresse MAC dans le cadre de la génération du GUID. Le temps est toujours un facteur
Clinton Ward
16

[Je comprends que c'est un vieux fil, juste en ajoutant plus de détails] Les deux réponses de Mark et Jon Hanna résument les différences, même si cela peut intéresser certains qui

Guid.NewGuid()

Appelle éventuellement CoCreateGuid (un appel COM à Ole32) (référence ici ) et le travail réel est effectué par UuidCreate .

Guid.Empty est destiné à être utilisé pour vérifier si un Guid contient tous les zéros. Cela pourrait également être fait en comparant la valeur du Guid en question avec le nouveau Guid ()

Donc, si vous avez besoin d'un identifiant unique , la réponse est Guid.NewGuid ()

Sudhanshu Mishra
la source
-2

Guid.NewGuid(), car il crée des GUID comme prévu.

Guid.NewGuid()crée un Guidobjet vide , l'initialise en appelant CoCreateGuidet renvoie l'objet.

new Guid() crée simplement un GUID vide (tous des zéros, je pense).

Je suppose qu'ils ont dû rendre le constructeur public tel Guidquel struct.

Sharath
la source
5
Quel est l'intérêt d'ajouter une réponse qui n'ajoute rien qui n'existe pas déjà dans les réponses qui sont là depuis des années?
Dinerdo