在C#中检查可空Guid是否为空

70

引用自问题的答案。

Guid是值类型,因此类型为Guid的变量一开始就不能为null。

那么如果我看到这个呢?

public Nullable<System.Guid> SomeProperty { get; set; }

我应该如何检查这个是否为空?像这样吗?

(SomeProperty == null)

还是像这样吗?

(SomeProperty == Guid.Empty)

有一个回答可以解决该问题,它涉及可为空的全局唯一标识符,也称为 Nullable<Guid>Guid? - Damien_The_Unbeliever
2
我认为这个链接对你会有帮助:https://dev59.com/_3RB5IYBdhLWcg3wQVSV - sagar
非常有帮助,谢谢! - Saturnix
注意:此问题特指可空的Guid...如何检查普通的Guid是否为空,请参考:https://dev59.com/8mkw5IYBdhLWcg3whK08 - Don Cheadle
7个回答

141
如果你想确定,你需要检查两个。
SomeProperty == null || SomeProperty == Guid.Empty

因为它可以是空的'Nullable',也可以是空的GUID,类似于这样{00000000-0000-0000-0000-000000000000}


2
确认一下:Guid.Empty.ToString() == "00000000-0000-0000-0000-000000000000" - Matt Kemp
7
GUID永远不会为空,但它可以是Guid.Empty。 - piris
8
如果你仔细阅读问题,你会发现它是一个可空的 Guid,而且可空的意义在于它可以为 null。因此,这里讨论的并不是 Guid 本身,而是它是否可空。 - Sir l33tname
这是正确的答案;请注意,如果您正在序列化来自输入的 Guid,如果使用可空变体,则 null 将序列化为 Guid.Empty,这可以在此处节省一个 null 检查。 - zcoop98

28

SomeProperty.HasValue 我认为这是你要找的。

可以看看 DevDave 或者 Sir l33tname 的回答。

编辑:顺便说一下,你可以写成 System.Guid? 而不是 Nullable<System.Guid> ;)


只有在使用可空 Guid 时,这才是正确的答案。我猜大多数人使用 Guid? 而不是 Guid - Don Cheadle
7
不够。空的Guid(即Guid.Empty)和null Guid不同。因此,您不仅需要检查Guid?.HasValue,还需检查Guid?.Value == Guid.Empty。 - Triynko
3
如@Triynko所说,这个答案需要更新,以便还要检查Guid.Empty。 - Sean T
这个答案是错误的。 - derekbaker783

20
注意,即使是空的 GuidHasValue 也会返回 true。 bool validGuid = SomeProperty.HasValue && SomeProperty != Guid.Empty;

4

Check Nullable<T>.HasValue

if(!SomeProperty.HasValue ||SomeProperty.Value == Guid.Empty)
{
 //not valid GUID
}
else
{
 //Valid GUID
}

正如其他人指出的那样:这确实会告诉你Guid是否为空,但要小心!如果Guid具有值Guid.Empty,则它将返回true。 - jeancallisti

3
你可以创建一个扩展方法来验证 GUID。
public static class Validate
{
    public static void HasValue(this Guid identity)
    {
        if (identity ==  null || identity == Guid.Empty)
            throw new Exception("The GUID needs a value");
    }
}

并使用扩展插件

    public static void Test()
    {
        var newguid = Guid.NewGuid();

        newguid.HasValue();
    }

1
我不会选择这种方法。你的方法名是一个真/假问题,因此它应该返回一个布尔值。我怀疑在许多代码库中,当检查一个值时抛出异常并不是一个好的选择,特别是当可空类型是完全有效的传递参数时。 - jhammond
1
对于这种方法的总体想法我表示赞同,但有两个强烈的反对意见:正如jhammond所说,如果它不是用于返回布尔值而只是用于引发异常,请不要将其命名为“hasSomething”。像C++一样,将其命名为“AssertSomething”。更普遍地说,不要给函数与系统的本机函数相同的名称。C#已经为可空类型定义了自己的HasValue! - jeancallisti

3
您应该使用HasValue属性: SomeProperty.HasValue 例如:
if (SomeProperty.HasValue)
{
    // Do Something
}
else
{
    // Do Something Else
}

FYI

public Nullable<System.Guid> SomeProperty { get; set; }

等同于:

public System.Guid? SomeProperty { get; set; }

MSDN 参考文档: http://msdn.microsoft.com/zh-cn/library/sksw8094.aspx


正如其他人所指出的那样:这确实可以告诉您Guid是否为空,但要小心!如果Guid具有值Guid.Empty,它将返回true。 - jeancallisti

3

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