什么是正确的检查:比较默认还是空的?
Guid value;
// ...
if (value != Guid.Empty)
或
if (value != default(Guid))
我觉得第二,但无法解释为什么。
什么是正确的检查:比较默认还是空的?
Guid value;
// ...
if (value != Guid.Empty)
或
if (value != default(Guid))
我觉得第二,但无法解释为什么。
由于Guid.Empty == default(Guid)
它并不重要,但我更喜欢Guid.Empty
的可读性。
我认为,从可读性的角度来看,两者都很好,这实际上取决于检查的实际意义。检查记录是否处于默认状态与检查记录是否包含空值(IMO)不同。 – James 2013-04-29 13:44:48
我要说的第二个纯粹是因为你必须在未初始化状态的记录,因此,它将包含默认值。您正在检查变量是否处于默认状态,而不是它是否为空 - 两种不同的检查(IMO)。
Guid.Empty
是相当于default(Guid)
在.NET所以从它并不重要技术点,不过,比较Guid.Empty
给我的印象是,你对一个特定值的检查,而不是是否该记录是默认状态。
Guid.Empty
相当于new Guid()
,这也相当于default(Guid)
。
当你反编译Guid
结构时,似乎;
public static readonly Guid Empty = new Guid();
由于Guid
是struct
,从Default Values Table;
通过将所有值类型字段设置为其默认值 值以及将所有引用类型字段设置为空而生成的值。
由于字段类型Guid
是,short
,int
,byte
,(这类型的默认值是0
),当我们使用default(Guid)
我们得到了所有字段Guid
是0
。
一个只读的GUID结构,其值是全零的实例。
当我们写这段代码;
Console.WriteLine(default(Guid));
Console.WriteLine(new Guid());
输出;
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
如果你关心的可读性(我想你应该)Guid.Empty
似乎不如我。
这是我做过的最不必要的解释':)' – 2013-04-29 13:52:09
两者都是一样的!
Guid.Empty
是Guid的只读字段,其值为{00000000-0000-0000-0000-000000000000}
。
随着default(Guid)
编译创建一个常数值,有{00000000-0000-0000-0000-000000000000}
。
在这两种情况下,您的值都会与内存中某个值进行比较。
为了便于阅读,请使用Guid.Empty
。
当您使用泛型时使用default(T)
。
为了便于阅读,我个人会使用Guid.Empty
。我唯一真正使用default
的时间是当没有其他选项时,例如当检查KeyValuePair
时。
你应该使用下列内容:
var guidIsEmpty = value == Guid.Empty;
两者都是技术上正确的,但是,比较Guid.Empty肯定,使更多的可读代码。
我知道这是一个古老的线程,但只是想附和:
当定义一个GUID的默认值作为参数传递给一个方法,你将不得不使用默认值(GUID),而不是的Guid .Empty,因为Guid.Empty不被视为编译时常量。
这将编译:
private void MyMethod(Guid id = default(Guid))
这不会编译:
private void MyMethod(Guid id = Guid.Empty)
谢谢@Mekuri,但是这并不直接回答这个问题。您的文章作为评论很棒,但没有足够的信息可以成为SO的答案。 – 2017-12-13 14:30:35
嗯......你有什么检查? – Oded 2013-04-29 13:29:28
第二个例子给你'使用未分配的局部变量'值'' – Default 2013-04-29 13:30:02
'default(Guid)== Guid.Empty' – Oded 2013-04-29 13:30:16