为什么不是';没有Guid.IsNullOrEmpty()方法

本文关键字:IsNullOrEmpty 方法 Guid 没有 为什么不 | 更新日期: 2023-09-27 18:28:42

这让我想知道为什么.NET中的Guid没有IsNullOrEmpty()方法(其中空表示全零)

在编写RESTneneneba API时,我在ASP.NETMVC代码中的几个位置都需要这个。

还是我错过了什么,因为互联网上没有人要求同样的东西?

为什么不是';没有Guid.IsNullOrEmpty()方法

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

if (guid == Guid.Empty)

首先,Guid不可为null。您可以查看:

myGuid == default(Guid)

相当于:

myGuid == Guid.Empty

这里有一个可为null的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()暗示该值可能为null(当它不能为null时)。如果您真的想,可以为IsNothing()IsInsignificant()等扩展名取一个不同的名称:)

您可以对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
    }
}

正如其他人所指出的,问题的前提并不完全存在。C#Guid不可为null。然而,Guid?是。检查Guid?null还是Guid.Empty的一种干净方法是检查GetValueOrDefault()的结果是否是Guid.Empty。例如,

Guid? id;
// some logic sets id
if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
    // Do something
}

这里有一个可为null的结构类型的通用扩展类:

public static class NullableExtensions
{
    public static bool IsNullOrDefault<T>(this T? self) where T : struct
    {
        return !self.HasValue || self.Value.Equals(default(T));
    }
}

你知道,我一直在中看到这样的语句

Guid是一个值类型,因此类型为Guid的变量对于从开始

但事实并非如此。

同意您不能将Guid编程设置为null,但当某些SQL引入UniqueIdentifier并将其映射到Guid时,如果该值在数据库中为null,则该值在C#中显示为null。