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

时间:2012-03-23 10:27:14

标签: c# asp.net-mvc

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

在编写REST API时,我需要在ASP.NET MVC代码的几个地方使用它。

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

7 个答案:

答案 0 :(得分:212)

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

if (guid == Guid.Empty)

答案 1 :(得分:25)

首先,Guid不可为空。你可以查一下:

myGuid == default(Guid)

相当于:

myGuid == Guid.Empty

答案 2 :(得分:9)

这是一个可以为空的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(当它不能时)。如果您真的想要,请为IsNothing()IsInsignificant()或其他任何内容添加不同的名称:)

答案 3 :(得分: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
    }
}

答案 4 :(得分:1)

正如其他人所指出的那样,问题的前提并不仅限于此。 C#Guid不可为空。但是,Guid?是。检查Guid?null还是Guid.Empty的一种干净方法是检查GetValueOrDefault()的结果是否是Guid.Empty。例如,

Guid? id;

// some logic sets id

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

答案 5 :(得分:0)

你知道我一直都在看这样的话

  

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

开始

但这不是真的。

您不能以编程方式将Guid设置为null,但是当某些SQL提取UniqueIdentifier并将其映射到Guid时,如果该值在db中为null,则在C#中该值为null。 / p>

答案 6 :(得分:0)

这是可为空的结构类型的通用扩展类:

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