GOTO语句标签无法使用变量的替代方案与分段执行表达式求助
问题描述
我有1到10号相互依赖的数学表达式,需要根据不同条件从指定位置开始计算:比如Case 0时执行1到10号表达式,Case 4时执行4到10号,以此类推。我尝试用下面的代码实现,但因为GOTO语句的标签不能是变量的限制失败了,求可行的解决方案。
尝试的代码
Private Sub XYZ(sender As Object, e As EventArgs) Handles SOME handle Dim ABCD As Integer = 0 Select Case ABCD Case 0 CallLineCalculations(1, "G0") Case 4 CallLineCalculations(1, "G4") Case 5 CallLineCalculations(1, "G5") End Select End Sub Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal gotoLable As String) GoTo gotolable G0: DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100 DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value G4: DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value G5: DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100 DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value ' ... 剩余表达式省略 End Sub
解决方案
方案1:用Select Case替代GOTO
把每个代码块的执行逻辑用条件判断控制,根据传入的起始标记决定是否执行前置块,再依次执行后续计算:
Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startFrom As String) ' 执行G0对应的计算(仅当起始标记为G0时) If startFrom = "G0" Then DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100 DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value End If ' 执行G4对应的计算(起始为G0或G4时都需要执行) If startFrom = "G0" Or startFrom = "G4" Then DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value End If ' 执行G5及后续的计算(所有起始标记都需要执行) DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100 DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value ' ... 剩余表达式依次按此逻辑补充 End Sub
方案2:拆分计算步骤为独立方法
把每个阶段的计算拆成独立Sub,通过Case判断调用对应的方法链,逻辑更清晰易维护:
' 对应原G0块(1-2号表达式) Private Sub CalcStep1To2(ByVal nRow As Integer) DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100 DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value End Sub ' 对应原G4块(4号表达式) Private Sub CalcStep4(ByVal nRow As Integer) DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value End Sub ' 对应原G5块(5-10号表达式) Private Sub CalcStep5To10(ByVal nRow As Integer) DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100 DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value ' ... 剩余步骤补充 End Sub Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startCase As Integer) Select Case startCase Case 0 CalcStep1To2(nRow) CalcStep4(nRow) CalcStep5To10(nRow) Case 4 CalcStep4(nRow) CalcStep5To10(nRow) Case 5 CalcStep5To10(nRow) ' 其他Case补充对应逻辑 End Select End Sub ' 调用时直接传入Case编号,无需传递标签字符串 Private Sub XYZ(sender As Object, e As EventArgs) Handles SOME handle Dim ABCD As Integer = 0 CallLineCalculations(1, ABCD) End Sub
方案3:用布尔变量控制执行流程
用一个标记变量判断是否到达起始位置,一旦到达就执行后续所有计算:
Private Sub CallLineCalculations(ByVal nRow As Integer, ByVal startLabel As String) Dim shouldExecute As Boolean = False ' 检查是否从G0开始 If startLabel = "G0" Then shouldExecute = True End If If shouldExecute Then DGVItemDetail(8, nRow).Value = Val(DGVItemDetail(6, nRow).Value) * Val(DGVItemDetail(7, nRow).Value) / 100 DGVItemDetail(9, nRow).Value = Val(DGVItemDetail(6, nRow).Value) - DGVItemDetail(8, nRow).Value End If ' 检查是否到达G4起始点 If startLabel = "G4" Or shouldExecute Then shouldExecute = True End If If shouldExecute Then DGVItemDetail(10, nRow).Value = DGVItemDetail(4, nRow).Value * DGVItemDetail(9, nRow).Value End If ' 检查是否到达G5起始点 If startLabel = "G5" Or shouldExecute Then shouldExecute = True End If If shouldExecute Then DGVItemDetail(12, nRow).Value = DGVItemDetail(10, nRow).Value * DGVItemDetail(11, nRow).Value / 100 DGVItemDetail(13, nRow).Value = DGVItemDetail(10, nRow).Value + DGVItemDetail(12, nRow).Value End If ' ... 剩余步骤按此逻辑补充 End Sub
内容的提问来源于stack exchange,提问作者Kirti
相关产品推荐
相关产品推荐

