我对这行代码有一些问题:
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;
}
}
}
答案 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)
编辑:现在我们可以看到你的代码,有两个问题:
您 将获得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]))
这几乎可以在任何条件下正常工作(不会引起错误)...