检查数组是否为null或为空

本文关键字:null 检查 是否 数组 | 更新日期: 2023-09-27 18:30:14

我对这行代码有一些问题:

if(String.IsNullOrEmpty(m_nameList[index]))

我做错了什么?

EDIT:在VisualStudio中,m_nameList用红色下划线,它表示"名称'm_nameList'在当前上下文中不存在"??

编辑2:我添加了更多的代码

    class SeatManager
{
    // Fields
    private readonly int m_totNumOfSeats;
    // Constructor
    public SeatManager(int maxNumOfSeats)
    {
        m_totNumOfSeats = maxNumOfSeats;
        // Create arrays for name and price
        string[] m_nameList = new string[m_totNumOfSeats];
        double[] m_priceList = new double[m_totNumOfSeats];
    }
    public int GetNumReserved()
    {
        int totalAmountReserved = 0;
        for (int index = 0; index <= m_totNumOfSeats; index++)
        {
            if (String.IsNullOrEmpty(m_nameList[index]))
            {
                totalAmountReserved++;
            }
        }
        return totalAmountReserved;
    }
  }
}

检查数组是否为null或为空

如果m_nameList为null,它仍然会爆炸,因为它会试图找到要传递给String.IsNullOrEmpty的元素。你会想要:

if (m_nameList == null || String.IsNullOrEmpty(m_nameList[index]))

这也是假设如果m_nameList为非null,则index将是有效的。

当然,这是在检查数组的元素是否为null或空,或者数组引用本身是否为null。如果只是想要检查数组本身(正如标题所示),则需要:

if (m_nameList == null || m_nameList.Length == 0)

编辑:现在我们可以看到你的代码,有两个问题:

  • 正如Henk在他的回答中所展示的那样,当你需要一个字段时,你试图使用局部变量
  • 将获得ArrayIndexOutOfBoundsException(一旦您使用了字段),原因如下:

    for (int index = 0; index <= m_totNumOfSeats; index++)
    

    由于您的绑定,这将执行m_totNumOfSeats + 1迭代。您想要:

    for (int index = 0; index < m_totNumOfSeats; index++)
    

    请注意,m_nameList[m_totNumOfSeats]无效,因为数组索引从C#中的0开始。因此,对于一个由5个元素组成的数组,有效索引为0、1、2、3、4。

GetNumReserved方法的另一个选择是使用:

int count = 0;
foreach (string name in m_nameList)
{
    if (string.IsNullOrEmpty(name))
    {
        count++;
    }
}
return count;

或者使用LINQ,它是一条单行线:

return m_nameList.Count(string.IsNullOrEmpty);

(不过,你确定你没有弄错吗?我本以为预订应该是名称不是null或空的,而不是名称为null或空。)

如果它是错误的方式,它会是这样的LINQ:

return m_nameList.Count(name => !string.IsNullOrEmpty(name));

第2版之后:

您正在将m_nameList定义为构造函数的局部变量
代码的其余部分需要它作为一个字段:

class SeatManager
{       
   // Fields
   private readonly int m_totNumOfSeats;
   private string[] m_nameList;
   private double[] m_priceList;
  // Constructor
  public SeatManager(int maxNumOfSeats)
  {
     m_totNumOfSeats = maxNumOfSeats;
     // Create arrays for name and price
     m_nameList = new string[m_totNumOfSeats];
     m_priceList = new double[m_totNumOfSeats];
  }
  ....
}

为了避免错误,您可以在if中执行一些预条件,比如:

if(m_nameList == null || index < 0 || m_nameList.Length < index || String.IsNullOrEmpty(m_nameList[index]))

这应该在几乎任何条件下都能正常工作(不会导致错误)。。。