2013-04-29 66 views
13

什么是正确的检查:比较默认还是空的?

Guid value; 
// ... 
if (value != Guid.Empty) 

if (value != default(Guid)) 

我觉得第二,但无法解释为什么。

+3

嗯......你有什么检查? – Oded 2013-04-29 13:29:28

+0

第二个例子给你'使用未分配的局部变量'值'' – Default 2013-04-29 13:30:02

+4

'default(Guid)== Guid.Empty' – Oded 2013-04-29 13:30:16

回答

21

由于Guid.Empty == default(Guid)它并不重要,但我更喜欢Guid.Empty的可读性。

+1

我认为,从可读性的角度来看,两者都很好,这实际上取决于检查的实际意义。检查记录是否处于默认状态与检查记录是否包含空值(IMO)不同。 – James 2013-04-29 13:44:48

4

我要说的第二个纯粹是因为你必须在未初始化状态的记录,因此,它将包含默认值。您正在检查变量是否处于默认状态,而不是它是否为空 - 两种不同的检查(IMO)。

Guid.Empty是相当于default(Guid)在.NET所以从它并不重要技术点,不过,比较Guid.Empty给我的印象是,你对一个特定值的检查,而不是是否该记录是默认状态。

5

Guid.Empty相当于new Guid(),这也相当于default(Guid)

当你反编译Guid结构时,似乎;

public static readonly Guid Empty = new Guid(); 

由于Guidstruct,从Default Values Table;

通过将所有值类型字段设置为其默认值 值以及将所有引用类型字段设置为空而生成的值。

由于字段类型Guid是,shortintbyte,(这类型的默认值是0),当我们使用default(Guid)我们得到了所有字段Guid0

Guid.Empty Field

一个只读的GUID结构,其值是全零的实例。

当我们写这段代码;

Console.WriteLine(default(Guid)); 
Console.WriteLine(new Guid()); 

输出;

00000000-0000-0000-0000-000000000000 
00000000-0000-0000-0000-000000000000 

如果你关心的可读性(我想你应该)Guid.Empty似乎不如我。

+4

这是我做过的最不必要的解释':)' – 2013-04-29 13:52:09

4

两者都是一样的!

Guid.Empty是Guid的只读字段,其值为{00000000-0000-0000-0000-000000000000}

随着default(Guid)编译创建一个常数值,有{00000000-0000-0000-0000-000000000000}

在这两种情况下,您的值都会与内存中某个值进行比较。

为了便于阅读,请使用Guid.Empty
当您使用泛型时使用default(T)

2

为了便于阅读,我个人会使用Guid.Empty。我唯一真正使用default的时间是当没有其他选项时,例如当检查KeyValuePair时。

2

你应该使用下列内容:

var guidIsEmpty = value == Guid.Empty; 

两者都是技术上正确的,但是,比较Guid.Empty肯定,使更多的可读代码。

0

我知道这是一个古老的线程,但只是想附和:

当定义一个GUID的默认值作为参数传递给一个方法,你将不得不使用默认值(GUID),而不是的Guid .Empty,因为Guid.Empty不被视为编译时常量。

这将编译:

private void MyMethod(Guid id = default(Guid)) 

这不会编译:

private void MyMethod(Guid id = Guid.Empty) 
+0

谢谢@Mekuri,但是这并不直接回答这个问题。您的文章作为评论很棒,但没有足够的信息可以成为SO的答案。 – 2017-12-13 14:30:35