19

什么是正确的检查:

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

或者

if (value != default(Guid))

我认为是第二个,但无法解释原因。

4

7 回答 7

28

因为Guid.Empty == default(Guid)这并不重要,但我更喜欢Guid.Empty可读性。

于 2013-04-29T13:29:55.003 回答
8

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.Empty Field

Guid 结构的只读实例,其值全为零

当我们编写这段代码时;

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

输出;

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

如果您关心可读性(我认为您应该这样做)Guid.Empty对我来说似乎更好。

于 2013-04-29T13:30:29.500 回答
5

两者是一样的!

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

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

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

用于Guid.Empty可读性。
在使用default(T)泛型时使用。

于 2013-04-29T13:31:11.660 回答
4

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

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

于 2013-04-29T13:30:25.467 回答
3

您应该使用以下内容:

var guidIsEmpty = value == Guid.Empty;

两者在技术上都是正确的,但是,与 Guid.Empty 相比,肯定会产生更具可读性的代码。

于 2013-04-29T13:35:57.017 回答
2

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

于 2013-04-29T13:31:40.937 回答
1

我知道这是一个旧线程,但只是想插话:

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

这将编译:

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

这不会编译:

private void MyMethod(Guid id = Guid.Empty)
于 2017-12-13T09:48:07.987 回答