检查数组是空还是空?

时间:2012-04-07 08:16:15

标签: c#

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

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

我做错了什么?

编辑:mccList在VisualStudio中用红色加下划线,并且它表示“当前上下文中不存在名称'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;
    }
  }
}

3 个答案:

答案 0 :(得分:18)

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

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

如果index非空,那么假设m_nameList有效。

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

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));

答案 1 :(得分:6)

在Edit2之后:

您将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];
  }

  ....
}

答案 2 :(得分:4)

为避免错误,您可以在if中执行一些前置条件,如下所示:

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

这几乎可以在任何条件下正常工作(不会引起错误)...