什么是正确的检查:
Guid value;
// ...
if (value != Guid.Empty)
或者
if (value != default(Guid))
我认为是第二个,但无法解释原因。
因为Guid.Empty == default(Guid)
这并不重要,但我更喜欢Guid.Empty
可读性。
Guid.Empty
等价于new Guid()
,也等价于default(Guid)
。
当你反编译Guid
结构时,它似乎;
public static readonly Guid Empty = new Guid();
由于Guid
是一个struct
,来自默认值表;
通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为空而产生的值。
由于字段类型Guid
是 , short
, int
, byte
(并且这种类型的默认值是0
),所以当我们使用时,default(Guid)
我们会得到Guid
所有字段都是 的a 0
。
Guid 结构的只读实例,其值全为零。
当我们编写这段代码时;
Console.WriteLine(default(Guid));
Console.WriteLine(new Guid());
输出;
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
如果您关心可读性(我认为您应该这样做)Guid.Empty
对我来说似乎更好。
两者是一样的!
Guid.Empty
是 Guid 的只读字段,其值为{00000000-0000-0000-0000-000000000000}
.
随着default(Guid)
编译创建一个常量值,具有{00000000-0000-0000-0000-000000000000}
.
在这两种情况下,您的值都会与内存中某处的另一个值进行比较。
用于Guid.Empty
可读性。
在使用default(T)
泛型时使用。
我会说第二个纯粹是因为您的记录处于未初始化状态,因此它将包含默认值。您正在检查变量是否处于默认状态,而不是它是否为空 - 2 种不同的检查 (IMO)。
Guid.Empty
相当于default(Guid)
.NET,所以从技术角度来看,这并不重要,但是,比较Guid.Empty
给我的印象是您检查特定值,而不是记录是否处于默认状态。
您应该使用以下内容:
var guidIsEmpty = value == Guid.Empty;
两者在技术上都是正确的,但是,与 Guid.Empty 相比,肯定会产生更具可读性的代码。
我个人会使用Guid.Empty
可读性。我真正这样使用的唯一一次default
是在没有其他选项的情况下,例如在检查KeyValuePair
.
我知道这是一个旧线程,但只是想插话:
将 Guid 的默认值定义为方法的参数时,您必须使用 default(Guid) 而不是 Guid.Empty,因为 Guid.Empty 不被视为编译时常量。
这将编译:
private void MyMethod(Guid id = default(Guid))
这不会编译:
private void MyMethod(Guid id = Guid.Empty)