C# Guid 可以为空吗?

Can a C# Guid be null?

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

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

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

"contactId == null" 会是真的吗?

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

对于未实现自定义相等运算符的 struct 类型,代码根本无法编译。

不过,没必要。

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

public void M(Guid guid)
{
    if (guid == null) throw new ArgumentNullException();
}

将编译为:

// 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

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

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

相反,您可能希望检查它是否不是 "zero" Guid:

x != Guid.Empty

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

if (contactId == Guid.Empty)

 contactId == default(Guid)