我有一个整数值,需要检查它是否为 NULL。我使用了 null 合并运算符来获取该值。
C#:
public int? Age;
if ((Age ?? 0)==0)
{
// do somethig
}
现在我需要检查一个老的应用程序,其中声明部分不是三元表达式。那么,如何在没有null-coalescing运算符的情况下实现这一点。
Nullable<T>
(或?
)公开了一个 HasValue
标志,用于表示值是否设置或该项是否为 null。
另外,可空类型支持==
:
if (Age == null)
??
是空合并运算符,不会得到布尔表达式,而是返回一个值:
int i = Age ?? 0;
那么以您的例子为例:
if (age == null || age == 0)
或者:
if (age.GetValueOrDefault(0) == 0)
或者:
if ((age ?? 0) == 0)
或者三目运算符:
int i = age.HasValue ? age.Value : 0;
age.GetValueOrDefault()
速度稍微快一些 - 它完全绕过了“我是否有一个值”的检查,直接返回值字段 - 这个字段将默认为default(T)
,也就是0
。 - Marc Gravell有几个要点:
Age
不是整数 - 它是一个可空的整数类型。它们并不相同。请参阅 Nullable<T>
的文档以了解详情。
??
是null 合并运算符,而不是三元运算符(实际上称为条件运算符)。
要检查可空类型是否具有值,请使用 HasValue
,或直接检查是否等于 null
:
if(Age.HasValue)
{
// Yay, it does!
}
if(Age == null)
{
// It is null :(
}
你可以简单地这样做:
public void CheckNull(int? item)
{
if (item != null)
{
//Do Something
}
}
自C# 9版本以来,您可以这样做:
public void CheckNull(int? item)
{
if (!(item is null))
{
//Do Something
}
}
或者更易读:
public void CheckNull(int? item)
{
if (item is not null)
{
//Do Something
}
}
由于int是值类型,您可以使用以下代码:
if(Age == default(int) || Age == null)
或者
if(Age.HasValue && Age != 0) or if (!Age.HasValue || Age == 0)
Adam已经给出了正确的答案,但您还有另一种重构代码的选择:
if (Age.GetValueOrDefault() == 0)
{
// it's null or 0
}
??
是空合并运算符。因此,等同于(Age ?? 0) == 0
不使用??
运算符是
(!Age.HasValue) || Age == 0
??
,所以你的这句话,
是错误的。现在我必须检查一个声明部分不是三元的旧应用程序。
截至2022年,您可以这样做:
public int? Age;
if (Age is == 0)
{
// do something
}
.ToString() 方法可以帮助你实现相同的功能
public int? Age;
if (!string.IsNullOrEmpty(Age.ToString()))
{
// do something
}
??
是一个空合并运算符。SomeValueType?
是一个可空类型。 - spenderint?
不是 "一个整数值"。 "整数值" 永远不会是空的,因此答案很简单:"它不是"。你拥有的是一个Nullable<int>
,或者int?
,或者只是 "可空的整数"。 - Marc Gravell