Guid.NewGuid () vs. new Guid ()


346

Qual è la differenza tra Guid.NewGuid()enew Guid() ?

Quale è preferito?


6
@ClintonWard Sono praticamente nuovo in C # e @ Bob2Chiv. Non riesco a eseguire il progetto in questo momento ed ero curioso di farlo.
OscarRyz,

6
@OscarRyz - Per testare rapidamente il codice in C #, utilizzo LinqPad .
DaveShaw,

5
In realtà credo che questa domanda sia pertinente, perché è confusa e in realtà non "0000000-0000 .." come migliore impostazione predefinita. Mi sono appena imbattuto in un problema in cui un client non poteva accedere a un sistema perché da qualche parte all'interno del progetto veniva chiamato il nuovo Guid () invece di NewGuid ()
Michiel Cornille

3
@DaveShaw - LinQPad è fantastico e lo uso molto. Ma volevo sottolineare che Visual Studio ora ha una finestra "C # Interactive" che è molto utile per questo tipo di test.
Mark Meuer,

1
@MichielCornille Ho appena avuto modo di conoscere la sensazione fratello ...
Jins Peter

Risposte:


580

new Guid() rende un guid "0" tutto vuoto (00000000-0000-0000-0000-000000000000 non è molto utile).

Guid.NewGuid() crea un vero guid con un valore unico, quello che probabilmente vuoi.


26
Un UUID vuoto è davvero molto utile. Fa un grande valore speciale.
Jon Hanna,

103
In una nota a margine, new Guid()equivale a Guid.Empty.
Steve Guidi,

30
@JonHanna Tutte le guide fanno grandi valori speciali. Sfortunatamente, quelli vuoti hanno la tendenza a scontrarsi. Concordo sul fatto che le guide vuote siano utili, in genere per indicare che qualcosa non è inizializzato.
MarkPflug

5
Quelli vuoti sono molto utili perché si scontrano. Un valore speciale che non si scontrava con il valore speciale noto sarebbe inutile.
Jon Hanna,

5
Penso che siate entrambi d'accordo sul fatto che sia una buona "guida conosciuta" da confrontare, come nel caso di indicare qualcosa in attesa di inizializzazione o in qualche altro stato noto. Personalmente preferirei usare un valore nullo, ma posso vedere che qualcuno potrebbe aver bisogno di una guida "speciale" ad un certo punto, e la guida all-0 è probabilmente la guida che ha meno probabilità di violare il principio della minima sorpresa per i futuri manutentori del codice.
PeterL

37

Guid.NewGuid() crea un nuovo UUID usando un algoritmo progettato per rendere le collisioni molto, molto improbabili.

new Guid() crea un UUID composto da zero.

Generalmente preferiresti il ​​primo, perché questo è il punto di un UUID (a meno che tu non lo riceva da qualche altra parte ovviamente).

Ci sono casi in cui vuoi davvero un UUID tutto zero, ma in questo caso Guid.Emptyodefault(Guid) è più chiaro sulle tue intenzioni e c'è meno possibilità che qualcuno lo legga aspettandosi che fosse stato creato un valore unico.

In tutto, new Guid() non è utile a causa di questa mancanza di chiarezza, ma non è possibile avere un tipo di valore che non ha un costruttore senza parametri che restituisce un valore di zero e zero.

Modifica: in realtà, è possibile avere un costruttore senza parametri su un tipo di valore che non imposta tutto su zero e null, ma non è possibile farlo in C # e le regole su quando verrà chiamato e quando ci sarà solo essere una struttura a zero creata crea confusione, quindi non è comunque una buona idea.


16
Aggiungerò questo per divertimento. Per una probabilità dell'1% di collisione, dovresti generare circa 2.600.000.000.000.000.000 di GUID
Clinton Ward,

8
@ClintonWard dipende da quale degli algoritmi UUID sono in uso, ma poiché alcuni usano indirizzi MAC per evitare collisioni tra macchine e tutti usano un fattore tempo per evitare collisioni sulla stessa macchina, è necessario creare anche più della normale matematica suggerirei. A meno che tu non abbia deliberatamente rovinato l'algoritmo cambiando il tempo e scherzando con gli indirizzi MAC, nel qual caso dovresti prenderne uno abbastanza rapidamente - ma questo è deliberatamente pasticciare con gli input.
Jon Hanna,

2
Quello era il v1 Guid. i nuovi GUID MS sono V4 e non utilizzano l'indirizzo MAC come parte della generazione GUID. Il tempo è comunque un fattore
Clinton Ward,

16

[Capisco che questo è un vecchio thread, aggiungendo solo qualche dettaglio in più] Le due risposte di Mark e Jon Hanna riassumono le differenze, anche se potrebbe interessare che

Guid.NewGuid()

Alla fine chiama CoCreateGuid (una chiamata COM a Ole32) (riferimento qui ) e il lavoro effettivo viene svolto da UuidCreate .

Guid.Empty deve essere utilizzato per verificare se un Guid contiene tutti gli zero. Questo potrebbe essere fatto anche confrontando il valore del Guid in questione con il nuovo Guid ()

Quindi, se hai bisogno di un identificatore univoco , la risposta è Guid.NewGuid ()


-2

Guid.NewGuid(), in quanto crea GUID come previsto.

Guid.NewGuid()crea un Guidoggetto vuoto , lo inizializza chiamandoCoCreateGuid e restituisce l'oggetto.

new Guid() crea semplicemente un GUID vuoto (tutti zeri, credo).

Immagino che dovessero rendere pubblico il costruttore come Guidè un struct.


5
Qual è il punto di aggiungere una risposta che non aggiunge nulla che non esiste già nelle risposte che sono qui da anni?
Dinerdo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.