为什么一维数组的索引会改变这种方式?

时间:2015-12-04 01:35:54

标签: arrays vb.net indexing

我是初学者,我遇到了一个问题,我正在努力理解一个字符串的一维数组(代码中的m_nameList)的索引。我有一个方法(在一个不是MainForm的Windows窗体应用程序的类中),如果某个索引处的数组的字符串为空,则返回FALSE,反之亦然。它看起来像这样:

Public Function IsReserved(index As Integer) As Boolean
    Dim reserved As Boolean = False
    If (Not String.IsNullOrEmpty(m_nameList(index))) Then
        reserved = True
    Else
        reserved = False
    End If
    Return reserved
End Function

我在MainForm上也有一个方法来调用它,如果第一个方法返回true,那么第二个方法显示一个对话框,否则它不显示(lstResults是一个列表框,对于项目的字符串有阵列):

Private Function CheckIfSeatIsAlreadyReserved() As Boolean
    Dim reserved As Boolean = m_seatMngr.IsReserved(lstResults.SelectedIndex)
    If (reserved) Then
        Dim msgBox As Integer = MessageBox.Show("The seat is already             reserved.     Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If (msgBox = DialogResult.Yes) Then
            Return True
        Else
            Return False
        End If
    Else
        Return True
    End If
End Function

我发现的问题是:如果在上面的第一个方法的代码中我没有将索引初始化为任何值,第二个方法将完美地工作,但如果我不选择,我将收到运行时错误listBox上的任何项目(因此index = -1)。另一方面,如果我将索引初始化为0或m_nameList.Length,那么如果我没有选择ListBox上的任何项目,程序将没有任何问题,它将很好地显示我为该案例编写的警告消息,但是第二种方法会以一种奇怪的方式运行:它会发现数组的所有字符串都已满,即使我只是“写”第一种,或者如果我“写”任何字符串,它会发现所有字符串都是空的不是第一个(通过写我的意思是我调用一个方法,将我的输入作为所选字符串的文本)。有关为什么会发生这种情况以及如何解决问题的任何想法?非常感谢你。

1 个答案:

答案 0 :(得分:2)

我将在下面得到答案,按照逻辑,让我们看看你的第一个方法。你可以将它重构为

Public Function IsReserved(index As Integer) As Boolean
    Return Not String.IsNullOrEmpty(m_nameList(index))
End Function

其他一切都被称为“噪音”。但正如 Fabio 指出的那样,如果index不好怎么办?让我们添加有用的代码

Public Function IsReserved(index As Integer) As Boolean
    If index < 0 OrElse index > m_nameList.Length - 1 Then
        Throw New ArgumentOutOfRangeException(". . .  . .")
    End If

    Return Not String.IsNullOrEmpty(m_nameList(index))
End Function

如果你遇到这个例外,你的程序有一个错误 - 你知道要解决这个功能的消费者。

现在让我们来看看你的消息

  

第二种方法将以一种奇怪的方式运行:即使我只是“写”第一个,它也会发现数组的所有字符串都已满,否则如果我“写”任何字符串,它会发现所有字符串为空

最有可能发生这种情况的原因 - 仅仅因为您在反复发送相同值时创建条件。因此结果是一样的。这很可能是一个错误

If (reserved) Then
. .  . . .  .
Else
    Return True  ' <---- BUG ALLERT
End If

还有两件事,你的第二种方法也可以缩减为1行。

Private Function CheckIfSeatIsAlreadyReserved() As Boolean
    Return m_seatMngr.IsReserved(lstResults.SelectedIndex) AndAlso _
           DialogResult.Yes = MessageBox.Show("The seat is already             reserved.     Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

End Function

而且,如果你做某种保留,阵列并不是一个好主意。 Dictionary(Of String, Boolean)怎么样?您的剧院或飞机有很多座位,您可以预先加载字典

d.Add("1A", False)
d.Add("1B", False)
d.Add("1C", False)
d.Add("1D", False)
d.Add("1E", False)
d.Add("1F", False)

这是你的整个飞机排。现在你可以用它做更多事情