@ClintonWard Sou praticamente novo em C # e @ Bob2Chiv Não posso executar o projeto agora e estava curioso sobre isso.
OscarRyz 13/08/12
6
@OscarRyz - Para testar rapidamente o código em C #, eu uso o LinqPad .
DaveShaw
5
Na verdade, acredito que essa pergunta é relevante, porque é confusa e eu realmente não "0000000-0000 .." como o melhor padrão. Eu só tive um problema onde um cliente não pode acessar um sistema, porque em algum lugar dentro do projeto novo Guid () foi chamado em vez de NewGuid ()
Michiel Cornille
3
@DaveShaw - O LinQPad é ótimo e eu uso muito. Mas eu queria ressaltar que o Visual Studio agora tem uma janela "C # Interactive" que é muito útil para esses tipos de testes.
Mark Meuer
11
@MichielCornille só tenho que saber o sentimento bro ...
Jins Peter
Respostas:
580
new Guid() cria um guid all-0 "vazio" (00000000-0000-0000-0000-000000000000 não é muito útil).
Guid.NewGuid() cria um guia real com um valor único, o que você provavelmente deseja.
Um UUID vazio é realmente muito útil. Faz um grande valor especial.
Jon Hanna
103
Em uma nota lateral, new Guid()é equivalente a Guid.Empty.
23812 Steve Guidi
30
@ JonHanna Todos os guias produzem grandes valores especiais. Infelizmente, os vazios tendem a colidir. Concordo que os guias vazios são úteis, normalmente, para indicar que algo não foi inicializado.
MarkPflug
5
Os vazios são muito úteis porque colidem. Um valor especial que não colidisse com o valor especial conhecido seria inútil.
Jon Hanna
5
Acho que vocês dois concordam que é um bom "guia conhecido" para comparar, como no caso de indicar que algo está aguardando inicialização ou está em algum outro estado conhecido. Pessoalmente, eu preferiria usar um valor nulo, mas percebo que alguém pode precisar de uma guia "especial" em algum momento, e a guia all-0 é provavelmente a menos provável que viole o principal de menor surpresa para futuros mantenedores do código.
Peterl
37
Guid.NewGuid() cria um novo UUID usando um algoritmo projetado para tornar as colisões muito, muito improváveis.
new Guid() cria um UUID que é todo-zeros.
Geralmente você prefere o primeiro, porque esse é o objetivo de um UUID (a menos que você esteja recebendo de outro lugar, é claro).
Há casos em que você realmente deseja um UUID zero, mas nesse caso Guid.Emptyou default(Guid)é mais claro sobre sua intenção, e há menos chances de alguém lê-lo esperando que um valor exclusivo tenha sido criado.
No geral, new Guid()isso não é útil devido a essa falta de clareza, mas não é possível ter um tipo de valor que não tenha um construtor sem parâmetros que retorne um valor com todos os zeros e nulos.
Edit: Na verdade, é possível ter um construtor sem parâmetros em um tipo de valor que não defina tudo como zero e nulo, mas você não pode fazê-lo em C #, e as regras sobre quando será chamado e quando haverá apenas ser uma estrutura totalmente zero criada é confusa, portanto não é uma boa ideia.
Vou adicionar isso por diversão. Para 1% de chance de colisão, que você precisa para gerar cerca de 2,600,000,000,000,000,000 GUIDs
Clinton Ward
8
@ClintonWard depende de qual algoritmo UUID está em uso, mas como alguns usam endereços MAC para evitar colisões entre máquinas e todos usam um fator de tempo para evitar colisões na mesma máquina, é necessário criar ainda mais do que a matemática normal sugeriria. A menos que você estrague deliberadamente o algoritmo, alterando a hora e mexendo nos endereços MAC, nesse caso, você deve obter um rapidamente - mas isso está mexendo deliberadamente nas entradas.
9137 Jon Hanna
2
Essa foi a v1 Guid. Os MS GUIDs mais recentes da Microsoft são V4 e não usam o endereço MAC como parte da geração do GUID. O tempo ainda é um fator embora
Clinton Ward
16
[Entendo que este é um tópico antigo, apenas adicionando mais alguns detalhes] As duas respostas de Mark e Jon Hanna resumem as diferenças, embora possa interessar a alguns que
Guid.NewGuid()
Eventualmente chama CoCreateGuid (uma chamada COM para Ole32) (referência aqui ) e o trabalho real é feito por UuidCreate .
Guid.Empty deve ser usado para verificar se um Guid contém todos os zeros. Isso também pode ser feito através da comparação do valor do Guid em questão com o novo Guid ()
Portanto, se você precisar de um identificador exclusivo , a resposta é Guid.NewGuid ()
Respostas:
new Guid()
cria um guid all-0 "vazio" (00000000-0000-0000-0000-000000000000 não é muito útil).Guid.NewGuid()
cria um guia real com um valor único, o que você provavelmente deseja.fonte
new Guid()
é equivalente aGuid.Empty
.Guid.NewGuid()
cria um novo UUID usando um algoritmo projetado para tornar as colisões muito, muito improváveis.new Guid()
cria um UUID que é todo-zeros.Geralmente você prefere o primeiro, porque esse é o objetivo de um UUID (a menos que você esteja recebendo de outro lugar, é claro).
Há casos em que você realmente deseja um UUID zero, mas nesse caso
Guid.Empty
oudefault(Guid)
é mais claro sobre sua intenção, e há menos chances de alguém lê-lo esperando que um valor exclusivo tenha sido criado.No geral,
new Guid()
isso não é útil devido a essa falta de clareza, mas não é possível ter um tipo de valor que não tenha um construtor sem parâmetros que retorne um valor com todos os zeros e nulos.Edit: Na verdade, é possível ter um construtor sem parâmetros em um tipo de valor que não defina tudo como zero e nulo, mas você não pode fazê-lo em C #, e as regras sobre quando será chamado e quando haverá apenas ser uma estrutura totalmente zero criada é confusa, portanto não é uma boa ideia.
fonte
[Entendo que este é um tópico antigo, apenas adicionando mais alguns detalhes] As duas respostas de Mark e Jon Hanna resumem as diferenças, embora possa interessar a alguns que
Eventualmente chama CoCreateGuid (uma chamada COM para Ole32) (referência aqui ) e o trabalho real é feito por UuidCreate .
Guid.Empty deve ser usado para verificar se um Guid contém todos os zeros. Isso também pode ser feito através da comparação do valor do Guid em questão com o novo Guid ()
Portanto, se você precisar de um identificador exclusivo , a resposta é Guid.NewGuid ()
fonte
Guid.NewGuid()
, pois cria GUIDs conforme o planejado.Guid.NewGuid()
cria umGuid
objeto vazio , inicializa-o chamandoCoCreateGuid
e retorna o objeto.new Guid()
apenas cria um GUID vazio (todos os zeros, eu acho).Eu acho que eles tiveram que tornar o construtor público como
Guid
é umstruct
.fonte