将Guid与默认值或空值进行比较

本文关键字:比较 空值 Guid 默认值 | 更新日期: 2023-09-27 18:11:15

检查Guid是否为空的正确方法是什么?

第一种方法:

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

或第二种方法:

if (value != default(Guid))

我认为第二种方法更好,但我无法解释为什么。

将Guid与默认值或空值进行比较

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

Guid.Empty等价于new Guid(),也等价于default(Guid)

当你对Guid结构进行反编译时,它似乎;

public static readonly Guid Empty = new Guid();

由于Guidstruct,因此来自默认值表

通过将所有值类型字段设置为默认值而产生的值值和所有引用类型字段设置为null。

由于Guid的字段类型为shortintbyte(此类型的默认值为0(,所以当我们使用default(Guid)时,我们得到一个Guid,所有字段都是0

来自Guid.Empty Field

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)

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

Guid.Empty相当于.NET中的default(Guid),因此从技术角度来看,这并不重要,但是,与Guid.Empty相比,给我的印象是,您检查的是特定值,而不是记录是否处于默认状态。

您应该使用以下内容:

var guidIsEmpty = value == Guid.Empty;

然而,与Guid相比,两者在技术上都是正确的。空的代码更有可读性。

就我个人而言,为了可读性,我会使用Guid.Empty。我唯一一次像这样真正使用default是在没有其他选项的情况下,例如在检查KeyValuePair时。

我知道这是一个老话题,但我只想插话:

将Guid的默认值定义为方法的参数时,必须使用default(Guid(而不是Guid.Empty,因为Guid.Empy不被视为编译时常数。

这将编译:

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

这不会编译:

private void MyMethod(Guid id = Guid.Empty)