在C#中检查整数值是否为空

66

我有一个整数值,需要检查它是否为 NULL。我使用了 null 合并运算符来获取该值。

C#:

public int? Age;

if ((Age ?? 0)==0)
{
   // do somethig
}

现在我需要检查一个老的应用程序,其中声明部分不是三元表达式。那么,如何在没有null-coalescing运算符的情况下实现这一点。


2
一个关于命名的问题:??是一个空合并运算符。SomeValueType?是一个可空类型。 - spender
@AdamHouldsworth 请尝试以常规回答的形式回答!!! - Matías Fidemraizer
你可以尝试在http://codereview.stackexchange.com/上发布。 - Felice Pollano
4
int? 不是 "一个整数值"。 "整数值" 永远不会是空的,因此答案很简单:"它不是"。你拥有的是一个 Nullable<int>,或者 int?,或者只是 "可空的整数"。 - Marc Gravell
8个回答

142

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;

12
好的答案,但是需要补充一点:没有参数的age.GetValueOrDefault()速度稍微快一些 - 它完全绕过了“我是否有一个值”的检查,直接返回值字段 - 这个字段将默认为default(T),也就是0 - Marc Gravell
1
@MarcGravell 很酷,但为了回答的目的,我选择明确表述。 - Adam Houldsworth

17

有几个要点:

Age 不是整数 - 它是一个可空的整数类型。它们并不相同。请参阅 Nullable<T> 的文档以了解详情。

??null 合并运算符,而不是三元运算符(实际上称为条件运算符)。

要检查可空类型是否具有值,请使用 HasValue,或直接检查是否等于 null

if(Age.HasValue)
{
   // Yay, it does!
}

if(Age == null)
{
   // It is null :(
}

4

你可以简单地这样做:

    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
    }

  }

2

由于int是值类型,您可以使用以下代码:

if(Age == default(int) || Age == null)

或者

if(Age.HasValue && Age != 0) or if (!Age.HasValue || Age == 0)

2

Adam已经给出了正确的答案,但您还有另一种重构代码的选择:

if (Age.GetValueOrDefault() == 0)
{
    // it's null or 0
}

1
如上所述,?? 是空合并运算符。因此,等同于
(Age ?? 0) == 0

不使用??运算符是

(!Age.HasValue) || Age == 0

然而,没有任何一个 .Net 版本具有 Nullable< T > 但没有 ??,所以你的这句话,

现在我必须检查一个声明部分不是三元的旧应用程序。

是错误的。

0

截至2022年,您可以这样做:

public int? Age;

if (Age is == 0)
{
   // do something
}

0

.ToString() 方法可以帮助你实现相同的功能

public int? Age;

if (!string.IsNullOrEmpty(Age.ToString()))
{
// do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接