这让我想知道为什么.NET中的Guid没有IsNullOrEmpty()
方法(其中空为全零)
在编写REST API时,我需要在ASP.NET MVC代码的几个地方使用它。
或者我错过了什么,因为互联网上没有人要求同样的东西?
答案 0 :(得分:212)
Guid
是value 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));
}
}