【问题标题】:Check an integer value is Null in c#在 c# 中检查整数值是否为 Null
【发布时间】:2012-09-21 09:45:47
【问题描述】:

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

C#:

public int? Age;

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

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

【问题讨论】:

  • 关于命名法的一点:?? 一个空合并运算符。 SomeValueType? 是可以为空的类型。
  • @AdamHouldsworth 尝试作为常规答案回答!!!
  • 你可以尝试在codereview.stackexchange.com发帖
  • int?不是“整数值”。 “整数值”是never null,所以答案很简单:“它不是”。你所拥有的是Nullable<int>,或int?,或者只是“一个可为空的int”。

标签: c# .net


【解决方案1】:

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;

【讨论】:

  • 好答案; func 事实,虽然:无参数的 age.GetValueOrDefault() 稍微快一点 - 它完全绕过“我有值”检查,并且只返回值字段 - 默认为 default(T),又名0.
  • @MarcGravell 很酷,但出于回答的目的,我选择明确。
【解决方案2】:

几件事:

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

??null coalesce operator,而不是三元运算符(实际上称为conditional operator)。

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

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

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

【讨论】:

    【解决方案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
        }
    
      }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        (Age ?? 0) == 0
        

        不使用?? 运算符是

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

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

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

        双重无效。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2021-01-08
            • 2023-03-18
            • 2020-10-17
            • 2014-01-25
            • 2011-04-17
            • 1970-01-01
            • 2013-11-29
            • 1970-01-01
            • 2021-07-19
            相关资源
            最近更新 更多