如何正确检查 Guid 是否为空?
第一种方法:
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
,请参阅默认值表;
将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为null所产生的值。
由于Guid
的字段类型是short
、int
、byte
(这些类型的默认值为0
),当我们使用default(Guid)
时,我们得到一个所有字段都是0
的Guid
。
值全为零的Guid结构的只读实例。
当我们编写这段代码时;
Console.WriteLine(default(Guid));
Console.WriteLine(new Guid());
输出;
00000000-0000-0000-0000-000000000000
00000000-0000-0000-0000-000000000000
Guid.Empty
对我来说更好。:)
- Soner Gönül两者是相同的!
Guid.Empty
是 Guid 的只读字段,具有值 {00000000-0000-0000-0000-000000000000}
。
使用 default(Guid)
,编译器会创建一个常量值,它具有 {00000000-0000-0000-0000-000000000000}
的值。
在两种情况下,您的值会与内存中的另一个值进行比较。
在需要可读性时,请使用 Guid.Empty
。
在使用泛型时,请使用 default(T)
。
Guid.Empty
等效于default(Guid)
,因此从技术角度来看并没有关系,但是与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)
default(Guid) == Guid.Empty
- Oded