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

20

如何正确检查 Guid 是否为空?

第一种方法:

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

或者第二种方法:

if (value != default(Guid))

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


3
好的,你想要检查什么? - Oded
第二个例子会给你一个“使用未分配的本地变量'value'”的错误。 - default
4
default(Guid) == Guid.Empty - Oded
2
如果GUID并不总是相关的,那么使用可空GUID可能更有意义? - Matthew
7个回答

31

由于 Guid.Empty == default(Guid) ,因此并不重要,但出于可读性考虑,我更喜欢使用 Guid.Empty


2
从可读性的角度来看,我认为两者都可以,这实际上取决于检查的含义。检查记录是否处于默认状态与检查记录是否包含空值是不同的(在我看来)。 - James

9

Guid.Empty 相当于 new Guid(),也相当于 default(Guid)

当你反编译 Guid 结构时,看起来是这样的;

public static readonly Guid Empty = new Guid();

由于Guid是一个struct,请参阅默认值表;

将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为null所产生的值。

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

请参阅Guid.Empty Field

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

当我们编写这段代码时;

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

输出;

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

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

7
这是我曾经做过的最不必要的解释 :) - Soner Gönül

5

两者是相同的!

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

使用 default(Guid),编译器会创建一个常量值,它具有 {00000000-0000-0000-0000-000000000000} 的值。

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

在需要可读性时,请使用 Guid.Empty
在使用泛型时,请使用 default(T)


4
我会选择第二个选项,因为你的记录处于未初始化状态,所以它将包含默认值。您正在检查变量是否处于默认状态,而不是它是否为空 - 这是两个不同的检查(我的看法)。
在.NET中,Guid.Empty等效于default(Guid),因此从技术角度来看并没有关系,但是与Guid.Empty进行比较让我觉得您正在检查特定的值,而不是记录是否处于默认状态。

3
您应该使用以下内容:
var guidIsEmpty = value == Guid.Empty;

两者在技术上都是正确的,但与Guid.Empty进行比较可以使代码更易读。


2

个人而言,我会使用Guid.Empty来提高可读性。我只在没有其他选项时才会像这样真正使用default,例如检查KeyValuePair时。


1

我知道这是一个旧的帖子,但是想要发表一下意见:

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

以下代码可以编译通过:

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

这段代码无法编译:

private void MyMethod(Guid id = Guid.Empty)

谢谢@Mekuri,但那并没有直接回答问题。你的帖子作为评论很好,但是在SO方面不包含足够的信息来作为答案。 - Sergey Metlov
这应该在编译器中标记为错误。 编译器应该知道它们从相同的常量得到相同的值。 Guid.Empty只是稍微绕了一下路,编译器应该知道这一点。string.Empty和其他类似的情况也是如此。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接