在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
我感觉这段代码不必要地冗长,感觉重复,并且可以简化。我将如何做到这一点,或者这不像感觉那样“错误”?
答案 0 :(得分: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
但是,如果您不需要在代码中的其他位置重复使用这些特殊指令值,那么这才有意义。
答案 1 :(得分: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
个语句。更短的变量名也有助于此。