C# Guid.NewGuid()与新Guid()的比较

C# Guid.NewGuid()与新Guid()的比较,c#,guid,C#,Guid,Guid.NewGuid()和NewGuid()之间有什么区别 哪个是首选的?new Guid()生成一个“空”的all-0 Guid(00000000-0000-0000-0000-000000000000不是很有用) Guid.NewGuid()生成一个具有唯一值的实际Guid,这是您可能需要的。Guid.NewGuid()使用一种算法创建一个新的UUID,该算法旨在使冲突非常、非常不可能发生 new Guid()创建一个全为零的UUID 通常您更喜欢前者,因为这是UUID的要点(当然,除非

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

哪个是首选的?

new Guid()
生成一个“空”的all-0 Guid(00000000-0000-0000-0000-000000000000不是很有用)

Guid.NewGuid()
生成一个具有唯一值的实际Guid,这是您可能需要的。

Guid.NewGuid()
使用一种算法创建一个新的UUID,该算法旨在使冲突非常、非常不可能发生

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

通常您更喜欢前者,因为这是UUID的要点(当然,除非您是从其他地方接收到它)

在某些情况下,您确实需要一个全零的UUID,但在这种情况下,
Guid.Empty
default(Guid)
更清楚地说明您的意图,并且有人阅读它时希望创建唯一值的可能性更小

总之,
new Guid()
由于不够清晰,因此没有那么大的用处,但是不可能有一个没有返回全零和空值的无参数构造函数的值类型


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

[我知道这是一条老线索,只是添加了一些细节] 马克和乔恩·汉娜的两个答案总结了这些差异,尽管这可能会引起一些人的兴趣

Guid.NewGuid()
最终调用CoCreateGuid(对Ole32的COM调用)(引用),实际工作由完成

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

因此,如果您需要一个唯一标识符,答案是Guid.NewGuid()
Guid.NewGuid()
,因为它会按预期创建Guid

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

newguid()
只会创建一个空的Guid(我想是全零)


我想他们必须公开构造函数,因为
Guid
是一个
struct

我添加它是为了好玩。如果冲突概率为1%,则需要生成大约2600000000000000000GUIDs@ClintonWard这取决于使用哪种UUID算法,但由于有些算法使用MAC地址来避免机器之间的冲突所有这些都使用时间因素来避免在同一台机器上发生冲突,您需要创建比正常数学所建议的更多的数据。除非您通过更改时间和弄乱MAC地址来故意破坏算法,在这种情况下,您应该很快得到一个数据,但这是故意弄乱输入。这就是v1guid。较新的MS GUID是V4,不使用MAC地址作为GUID生成的一部分。时间仍然是一个因素,尽管空UUID确实非常有用。它具有很大的特殊价值。另一方面,
new GUID()
相当于
Guid。Empty
@JonHanna所有的Guid都有很好的特殊值。不幸的是,空的Guid有冲突的倾向。我同意空的Guid是有用的,通常用于指示未初始化的东西。空的Guid非常有用,因为它们会发生冲突。一个没有冲突的特殊值已知的特殊值将是无用的。我想你们都同意它是一个很好的“已知guid”进行比较,例如在指示某些东西正在等待初始化或处于其他已知状态的情况下。我个人更喜欢使用空值,但我可以看出有人可能需要“特殊”guid,而all-0 guid可能是最不可能违反原则的guid,这对未来的代码维护者来说是最不意外的。@ClintonWard我对C#和@Bob2Chiv几乎是新手,我现在不能运行这个项目,并且对它很好奇。@OscarRyz-为了在C#中快速测试代码,我使用了。实际上我相信这个问题on是相关的,因为它令人困惑,我并不是真的将“0000000-0000..”作为最佳默认值。我只是遇到了一个问题,客户端无法登录到系统,因为在项目的深处调用了new Guid()而不是NewGuid()@DaveShaw-LinQPad很棒,我经常使用它。但我想指出的是,Visual Studio现在有一个“C#Interactive”窗口,这对这类测试非常有用。@MichielCornille刚刚了解了这种感觉,兄弟……添加一个答案,而不添加任何已经存在多年的答案中不存在的东西,这有什么意义?