C# Guid 可以为空吗?
Can a C# Guid be null?
我知道有Guid?
和Nullable<Guid>
这样的东西。我有这段代码并且可以编译:
public Contact GetContact(Guid contactId)
{
if (contactId == null)
{
throw new ArgumentNullException(nameof(contactId));
}
return _communicationsDbContext.Set<Contact>().Find(contactId);
}
"contactId == null" 会是真的吗?
System.Guid 是一个结构,它不能为空,因为它不是引用类型。我相信对于实现自定义相等运算符(例如 int、Guid 等)的已知 struct
类型,编译器会将 null 比较替换为 false。 (因此整个比较和抛出语句将消失)
对于未实现自定义相等运算符的 struct
类型,代码根本无法编译。
不过,没必要。
public void M(Guid guid)
{
if (guid == null) throw new ArgumentNullException();
}
将编译为:
// Methods
.method public hidebysig
instance void M (
valuetype [mscorlib]System.Guid guid
) cil managed
{
// Method begins at RVA 0x2050
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method C::M
如您所见,方法中的第一条指令是return。
System.Guid
是 struct
,结构永远不会是 null
。
相反,您可能希望检查它是否不是 "zero" Guid:
x != Guid.Empty
Guid 是一种值类型,因此它不能为空。一种检查方法是:
if (contactId == Guid.Empty)
或
contactId == default(Guid)
我知道有Guid?
和Nullable<Guid>
这样的东西。我有这段代码并且可以编译:
public Contact GetContact(Guid contactId)
{
if (contactId == null)
{
throw new ArgumentNullException(nameof(contactId));
}
return _communicationsDbContext.Set<Contact>().Find(contactId);
}
"contactId == null" 会是真的吗?
System.Guid 是一个结构,它不能为空,因为它不是引用类型。我相信对于实现自定义相等运算符(例如 int、Guid 等)的已知 struct
类型,编译器会将 null 比较替换为 false。 (因此整个比较和抛出语句将消失)
对于未实现自定义相等运算符的 struct
类型,代码根本无法编译。
不过,没必要。
public void M(Guid guid)
{
if (guid == null) throw new ArgumentNullException();
}
将编译为:
// Methods
.method public hidebysig
instance void M (
valuetype [mscorlib]System.Guid guid
) cil managed
{
// Method begins at RVA 0x2050
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method C::M
如您所见,方法中的第一条指令是return。
System.Guid
是 struct
,结构永远不会是 null
。
相反,您可能希望检查它是否不是 "zero" Guid:
x != Guid.Empty
Guid 是一种值类型,因此它不能为空。一种检查方法是:
if (contactId == Guid.Empty)
或
contactId == default(Guid)