2

在 vb.net 中,我有一个包含四个复选框的表单。每个复选框表示(选中时)用户想要在他们的订单中添加特殊指令。代码如下所示:

        If SpecialInstruction1CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_1_String)
        End If
        If SpecialInstruction2CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_2_String)
        End If
        If SpecialInstruction3CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_3_String)
        End If
        If SpecialInstruction4CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_4_String)
        End If

我有一种感觉,这段代码不必要地冗长,感觉重复,并且可以简化。我将如何做这件事,或者这不像感觉的那样“错误”?

4

2 回答 2

1

第一个问题是您的特殊指令不应存储在单独的变量中。它们应该存储在数组或其他类型的列表中。然后您可以通过索引(例如specialInstructions(1))访问它们。

然后你可以像这样按索引遍历复选框:

For i As Integer = 1 to 4
    Dim box As CheckBox = DirectCast(Me.Controls("SpecialInstruction" & i.ToString() & "CheckBox"), CheckBox)
    If box.Checked Then list.Add(specialInstructions(i))
Next

或者,您可以将对复选框的引用存储在数组中,然后更轻松地循环它们,例如:

Dim checkBoxes() As CheckBox = {
    SpecialInstruction1CheckBox,
    SpecialInstruction2CheckBox,
    SpecialInstruction3CheckBox,
    SpecialInstruction4CheckBox}

' ...

For i As Integer = 0 to checkBoxes.Length - 1
    If checkBoxes(i).Checked Then list.Add(specialInstructions(i))
Next

另一种选择是将特殊说明存储在Tag每个复选框的属性中,然后您可以从控件中检索值,如下所示:

For Each i As CheckBox In checkBoxes
    If i.Checked Then list.Add(i.Tag)
Next

但这只有在您不需要在代码的其他地方重用这些特殊指令值时才有意义。

于 2014-03-12T17:55:13.557 回答
0

实际上,代码本身并没有那么糟糕。这主要取决于具体做什么AddSpecialInstruction。根据您的具体情况,最好将字符串指令列表传递给它:

Dim list As New List(Of String)

If SpecialInstruction1CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_1_String)
If SpecialInstruction2CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_2_String)
If SpecialInstruction3CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_3_String)
If SpecialInstruction4CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_4_String)

AddSpecialInstructions(list)

由于您还需要缩减代码,所以我If在一行上发表了声明。更短的变量名也会对此有所帮助。

于 2014-03-12T17:46:40.573 回答