为什么没有Guid.IsNullOrEmpty()方法?

115

让我感到好奇的是,.NET中的Guid为什么没有IsNullOrEmpty()方法(其中空的意思是全0)。

在编写REST API时,在我的ASP.NET MVC代码的多个位置需要使用此方法。

或者我有所遗漏,因为互联网上没有人提出同样的问题?


为了开始,可以参考https://dev59.com/XXE95IYBdhLWcg3wXcrd,但是对于您的需求,可以使用`Guid.Empty`。 - V4Vendetta
7个回答

261

Guid 是一个值类型, 因此类型为Guid的变量一开始就不能为null。如果你想知道它是否与空guid相同,只需使用:

if (guid == Guid.Empty)

Entity Framework 定义的 Guid 变量为 Guid?(可为空)的情况怎么办? - Gautam Jain
7
如果你想的话,可以使用 if (nullableGuid == null || nullableGuid == Guid.Empty)... 或者创建自己的扩展方法。大概情况下这种情况出现的频率不太高,对于大多数人来说不值得去这样做。 - Jon Skeet
3
您可以为所有值类型创建一个通用的扩展方法。例如:public static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); } - Jeppe Stig Nielsen

33

首先,Guid是不可空类型。您可以进行检查:

myGuid == default(Guid)

其等价于:

myGuid == Guid.Empty

7
从C# 7.1开始,您可以直接使用myGuid == default - Brad M

12

这里是一个针对可空 Guid 的简单扩展方法。

/// <summary>
/// Determines if a nullable Guid (Guid?) is null or Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid? guid)
{
  return (!guid.HasValue || guid.Value == Guid.Empty);
}

更新

如果你真的想要在任何地方使用它,你可以为常规Guid编写另一个扩展方法。它永远不会为空,所以有些人可能不喜欢这样做...但它实现了你寻找的目的,并且你不需要知道你是否正在使用 Guid? 或 Guid(对于重构等很好)。

/// <summary>
/// Determines if Guid is Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid guid)
{
  return (guid == Guid.Empty);
}

现在,您可以在所有情况下使用someGuid.IsNullOrEmpty();,无论您是使用Guid还是Guid?。

正如我所说,有些人会抱怨命名,因为IsNullOrEmpty()暗示该值可能为空(而实际上不可能为空)。如果您真的想要,可以为扩展方法想出一个不同的名称,例如IsNothing()IsInsignificant()或其他任何名称 :)


2
你可以创建一个扩展方法来为 Guid 添加 IsEmpty 功能:
public static class GuidEx
{
    public static bool IsEmpty(this Guid guid)
    {
        return guid == Guid.Empty;
    }
}

public class MyClass
{
    public void Foo()
    {
        Guid g;
        bool b;

        b = g.IsEmpty(); // true

        g = Guid.NewGuid();

        b = g.IsEmpty; // false

        b = Guid.Empty.IsEmpty(); // true
    }
}

"g = new Guid()" 实际上会创建一个空的 GUID。你是否打算写成 "g = Guid.NewGuid()"? - David Hedlund

2

正如其他人指出的那样,问题的前提并不完整。C#中的Guid类型是不可空的。但是,Guid?是可空的。一种简洁的方法来检查一个Guid?是否为null或者Guid.Empty,就是检查GetValueOrDefault()的结果是否为Guid.Empty。例如:

Guid? id;

// some logic sets id

if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}

0
这是一个针对可空结构类型的通用扩展类:
public static class NullableExtensions
{
    public static bool IsNullOrDefault<T>(this T? self) where T : struct
    {
        return !self.HasValue || self.Value.Equals(default(T));
    }
}

-2

你知道吗?我经常看到这样的陈述:

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

但这并不是真的。

确实,你无法以编程方式将 Guid 设置为 null,但当某些 SQL 语句检索 UniqueIdentifier 并将其映射到 Guid 时,如果数据库中的值为 null,则在 C# 中该值也为 null。


如果数据库中的字段可为空,则更正确的做法是指定该类型为可空类型(Guid?)。 - cdimitroulas

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