Альтернатива GoSub в VB.net - PullRequest
       11

Альтернатива GoSub в VB.net

0 голосов
/ 16 ноября 2018

Мне назначен проект для замены всех GoSubs в приложении, основанном на VBA, потому что это приложение переключается на VB.net, и GoSubs там не поддерживаются. Вот упрощенная версия исходного кода:

Sub Main ()
  Dim A As String
  ...
  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  GoSub Execute
  ...
  Execute:
    Call BuiltInSub1 (A)
    Call BuiltInSub2 (A)
    'where BuiltInSubs are some predefined procedures within the application
    ...
  Return

End Sub

Я думаю об использовании Call для замены GoSub следующим образом:

Sub Main ()
  Dim A As String

  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  Call Execute
  ...

End Sub

Sub Execute ()
   ...
   Call BuiltInSub1 (A)
   Call BuiltInSub2 (A)
   ...
End Sub

Очевидная ошибка моей модифицированной версии выше заключается в том, что переменная A не объявлена ​​в Sub Execute. Один из вариантов, который я могу придумать, - переопределить A в Sub Execute, но для этого мне нужно будет повторно объявить все переменные, используемые для определения A в Main, где их довольно много.

Какой самый лучший / самый эффективный способ заменить GoSub в моем случае?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я считаю, что функции lamda могут иметь вложенную переменную область видимости) в VB.net

Dim A
Dim B
Dim xecute = function()
    BuiltInSub1(A)
    BuiltInSub2(A)
End Sub
A = 1
B=xecute()
A=2
B=xecute()
0 голосов
/ 16 ноября 2018

Исходя из моих комментариев выше, ваш код должен выглядеть следующим образом:

Sub Main ()
  Dim A As String

  If ConditionX Then A = "Black"
  Else A = "White"
  End If
  ...
  Execute(A)
  ...

End Sub

Sub Execute(A As SomeType)
   ...
   BuiltInSub1(A)
   BuiltInSub2(A)
   ...
End Sub

Если вы обнаружите, что вам нужно объявить параметры ByRef, вы можете рассмотреть рефакторинг как более долгосрочное решение.

...