【问题标题】:Can a C# Guid be null? [duplicate]C# Guid 可以为空吗? [复制]
【发布时间】:2019-06-11 03:24:40
【问题描述】:

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

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

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

“contactId == null”可以是真的吗?

【问题讨论】:

  • 不,它不能。事实上,当你编译时,你会得到一个警告告诉你
  • 顺便说一下,Guid?Nullable&lt;Guid&gt; 的简写
  • 当你尝试设置contactId = null;时发生了什么?
  • 我尝试了 Gnbrkm41 所说的。编译器只是删除了那行代码。
  • 我在问一个 Guid 是否可以为空? (我不是在问如何使它可以为空)。我问的原因是因为编译器没有抱怨代码。

标签: c# guid


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

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

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

    x != Guid.Empty
    

    【讨论】:

      【解决方案3】:

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

      if (contactId == Guid.Empty)
      

       contactId == default(Guid)
      

      【讨论】:

        猜你喜欢
        • 2017-03-07
        • 2012-12-10
        • 2015-04-01
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        相关资源
        最近更新 更多