Guid.NewGuid()与new Guid()


346

Guid.NewGuid()和之间有什么区别new Guid()

首选哪一个?


6
@ClintonWard我实际上是C#和@ Bob2Chiv的新手,我现在无法运行该项目,对此感到很好奇。
OscarRyz

6
@OscarRyz-为了使用C#快速测试代码,我使用LinqPad
DaveShaw 2012年

5
实际上,我确实相信这个问题是相关的,因为这很令人困惑,我也不是最好的默认值“ 0000000-0000 ..”。我只是遇到一个问题,即客户端无法登录系统,因为在项目深处的某个地方调用了新的Guid()而不是NewGuid()
Michiel Cornille

3
@DaveShaw-LinQPad很棒,我经常使用它。但是我想指出,Visual Studio现在有一个“ C#交互式”窗口,对于此类测试非常有用。
Mark Meuer '16

1
@MichielCornille刚认识了兄弟……
金斯·彼得

Answers:


580

new Guid() 使“空”全0 guid(00000000-0000-0000-0000-000000000000不太有用)。

Guid.NewGuid() 用您可能想要的唯一值制作一个实际的Guid。


26
空的UUID确实非常有用。它具有很大的特殊价值。
乔恩·汉娜

103
从侧面讲,new Guid()等同于Guid.Empty
史蒂夫·吉迪

30
@JonHanna所有的向导都具有特殊的价值。不幸的是,空的趋向于碰撞。我同意空的guid有用,但是通常表示某些东西未初始化。
MarkPflug 2012年

5
空的碰撞非常有用,因为它们会碰撞。与已知的特殊值不冲突的特殊值将是无用的。
乔恩·汉纳

5
我认为你们都同意,它可以与一个很好的“已知GUID”进行比较,例如在指示某些东西正在等待初始化或处于其他已知状态的情况下。就我个人而言,我更喜欢使用null值,但是我可以看到有人在某个时候可能需要“特殊” guid,而全0 guid可能是该guid最不可能违反未来维护者的最不惊奇原则代码。
PeterL 2012年

37

Guid.NewGuid() 使用旨在使碰撞非常非常不可能发生的算法创建新的UUID。

new Guid() 创建一个全零的UUID。

通常,您会更喜欢前者,因为这就是UUID的意义(除非您当然从其他地方收到它)。

在某些情况下,您确实确实需要全零的UUID,但是在这种情况下,Guid.Empty或者default(Guid)您的意图更加明确,并且有人希望创建唯一值的可能性很小。

总而言之,new Guid()由于缺乏清晰性,它不是很有用,但是不可能有没有没有参数的构造函数返回全零和空值的值类型。

编辑:实际上,有可能在没有将所有内容都设置为零和null的值类型上有一个无参数的构造函数,但是您不能在C#中做到这一点,还有关于何时以及何时调用它的规则只是被创建的全零结构令人困惑,所以这不是一个好主意。


16
我将其添加为好玩。要产生1%的碰撞几率,您需要生成大约2600,000,000,000,000,000 GUID
Clinton Ward

8
@ClintonWard取决于使用的是哪种UUID算法,但是由于有些使用MAC地址来避免机器之间的冲突,并且都使用时间因子来避免同一台机器上的冲突,因此您需要创建的内容比普通数学还要多会建议。除非您通过更改时间和弄乱MAC地址来故意弄乱算法,否则这种情况下您应该很快得到一个-但这是故意弄乱输入。
乔恩·汉纳

2
那是v1 Guid。较新的MS GUID为V4,并且不将MAC地址用作GUID生成的一部分。尽管时间仍然是一个因素
克林顿·沃德

16

[我理解这是一个老话题,只是增加了一些细节] Mark和Jon Hanna的两个答案总结了这些差异,尽管可能有人对此感兴趣。

Guid.NewGuid()

最终调用CoCreateGuid(对Ole32的COM调用)(在此处参考),实际工作由UuidCreate完成。

Guid.Empty用于检查Guid是否包含全零。也可以通过将有问题的Guid的值与新的Guid()进行比较来完成

因此,如果您需要一个唯一的标识符,答案是Guid.NewGuid()


-2

Guid.NewGuid(),因为它会按预期创建GUID。

Guid.NewGuid()创建一个空Guid对象,通过调用CoCreateGuid将其初始化并返回该对象。

new Guid() 只会创建一个空的GUID(我认为全为零)。

我猜他们不得不做出的构造公众Guid是一个struct


5
添加答案而不添加已经存在多年的答案中不存在的内容有什么意义?
Dinerdo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.