C#Guid可以为空吗?

时间:2019-01-17 00:11:37

标签: c# guid

我知道有Guid?Nullable<Guid>这样的东西。我有这段代码,它可以编译:

public Contact GetContact(Guid contactId)
{
    if (contactId == null)
    {
        throw new ArgumentNullException(nameof(contactId));
    }

    return _communicationsDbContext.Set<Contact>().Find(contactId);
}

“ contactId == null”可以为真吗?

3 个答案:

答案 0 :(得分:2)

System.Guid是一个结构,不能为null,因为它不是引用类型。我相信,对于实现自定义相等运算符的已知struct类型(例如int,Guid等),编译器会将null比较替换为false。 (因此,整个比较和throw语句将消失)

对于没有实现自定义相等运算符的public void M(Guid guid) { if (guid == null) throw new ArgumentNullException(); } 类型,代码将完全无法编译。

尽管如此,这是不必要的。

请参阅:https://sharplab.io/#v2:EYLgtghgzgLgpgJwDQxASwDYB8ACAGAAhwEYBuAWACgcBmIgJgIGECBvKgzounAFgICyACgDiAVzQATAgHMJkgJRsOXVWgBmBIXKkEAvHoIA7MRgxKYACwQB7AO7G4DgIII5YOEZgA5UxgCiAB4AxnAADjBoNkZCChSUqgC+VIlAA===

// Methods
    .method public hidebysig 
        instance void M (
            valuetype [mscorlib]System.Guid guid
        ) cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 1 (0x1)
        .maxstack 8

        IL_0000: ret
    } // end of method C::M

将被编译为:

search

如您所见,方法中的第一条指令是return。

答案 1 :(得分:1)

System.Guidstruct,结构永远不能是null

相反,您可能希望检查它是否不是“零”引导:

x != Guid.Empty

答案 2 :(得分:0)

Guid是一种值类型,因此它不能为null。一种检查方法是:

if (contactId == Guid.Empty)

 contactId == default(Guid)