57

我有一个整数值,我需要检查它是否为 NULL。我使用空合并运算符得到它

C#:

public int? Age;

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

现在我必须检查一个较旧的应用程序,其中声明部分不是三元的。那么,如何在没有空合并运算符的情况下实现这一点。

4

6 回答 6

128

Nullable<T>(或?)公开一个HasValue标志来表示是否设置了一个值或该项是否为空。

此外,可空类型支持==

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;
于 2012-09-21T09:47:20.603 回答
16

几件事:

Age不是整数 - 它是可为的整数类型。它们是不相同的。有关详细信息,请参阅Nullable<T>MSDN 上的文档。

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

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

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

if(Age == null)
{
   // It is null :(
}
于 2012-09-21T09:48:18.563 回答
3

只需您可以这样做:

    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
    }

  }
于 2015-10-10T19:43:52.267 回答
2

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

if (Age.GetValueOrDefault() == 0)
{
    // it's null or 0
}
于 2012-09-21T09:50:30.070 回答
1

如上所述,??是空合并运算符。所以相当于

(Age ?? 0) == 0

不使用??运算符是

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

但是,没有任何版本的 .Net 具有Nullable< T >但不是??,所以你的声明,

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

是双重无效的。

于 2012-09-21T09:56:05.523 回答
1

因为int是一个 ValueType 那么您可以使用以下代码:

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

或者

if(Age.HasValue && Age != 0) or if (!Age.HasValue || Age == 0)
于 2018-08-29T15:27:19.757 回答