让我感到好奇的是,.NET中的Guid为什么没有IsNullOrEmpty()
方法(其中空的意思是全0)。
在编写REST API时,在我的ASP.NET MVC代码的多个位置需要使用此方法。
或者我有所遗漏,因为互联网上没有人提出同样的问题?
让我感到好奇的是,.NET中的Guid为什么没有IsNullOrEmpty()
方法(其中空的意思是全0)。
在编写REST API时,在我的ASP.NET MVC代码的多个位置需要使用此方法。
或者我有所遗漏,因为互联网上没有人提出同样的问题?
Guid
是一个值类型, 因此类型为Guid
的变量一开始就不能为null。如果你想知道它是否与空guid相同,只需使用:
if (guid == Guid.Empty)
if (nullableGuid == null || nullableGuid == Guid.Empty)
... 或者创建自己的扩展方法。大概情况下这种情况出现的频率不太高,对于大多数人来说不值得去这样做。 - Jon Skeetpublic static bool IsNullOrDefault<T>(this T? self) where T : struct { return !self.HasValue || self.Value.Equals(default(T)); }
- Jeppe Stig Nielsen首先,Guid
是不可空类型。您可以进行检查:
myGuid == default(Guid)
其等价于:
myGuid == Guid.Empty
myGuid == default
。 - Brad M这里是一个针对可空 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()
或其他任何名称 :)
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
类型是不可空的。但是,Guid?
是可空的。一种简洁的方法来检查一个Guid?
是否为null
或者Guid.Empty
,就是检查GetValueOrDefault()
的结果是否为Guid.Empty
。例如:
Guid? id;
// some logic sets id
if (Guid.Empty.Equals(guid.GetValueOrDefault()))
{
// Do something
}
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 类型的变量一开始就不能为 null
但这并不是真的。
确实,你无法以编程方式将 Guid 设置为 null,但当某些 SQL 语句检索 UniqueIdentifier 并将其映射到 Guid 时,如果数据库中的值为 null,则在 C# 中该值也为 null。