VB.NET(及所有現代高級語言)**不支援**用 GoTo 跳轉進函數/過程內部,更別提「不調用參數、獲取返回值、自動退出」這類違背調用約定的操作。本文解釋語言級限制,並給出結構化替代方案。
| 層面 | 說明 |
|---|---|
| 編譯器/IL 層面 | 方法調用涉及棧幀分配、參數壓棧、返回地址保存、局部變量初始化。GoTo 只是 br (分支指令),無法構建合法棧幀。 |
| 語言規範 | VB.NET/C#/Java 等限制 GoTo 僅能在同一方法內跳轉標籤,防止「意大利面條代碼」。 |
| 運行時檢查 | CLR 執行引擎會驗證調用約定,非法跳轉導致 InvalidProgramException 或行為未定義。 |
yield return / async-await / 無狀態機庫。Func/Action、策略模式、反射 MethodInfo.Invoke。Public Sub FullProcess()
Init()
CoreLogic()
Cleanup()
End Sub
' 外部只需 CoreLogic 時
Public Sub OnlyCore() { CoreLogic() }
Public Delegate Sub ProcessStep()
Public Sub Execute(ByVal steps As List(Of ProcessStep))
For Each step In steps
step.Invoke()
Next
End Sub
' 調用
Execute(New List(Of ProcessStep) From {AddressOf Step2, AddressOf Step3})
Public Iterator Function Steps() As IEnumerable(Of String)
Yield "Step1"
Yield "Step2" ' 外部可選擇只取 Step2 之後
Yield "Step3"
End Function
' 使用
For Each s In Steps().Skip(1) ' 跳過 Step1
Console.WriteLine(s)
Next
VB6 允許 GoSub/Return 類似子程序調用,但 .NET 時代已完全移除。若維護遺留 VB6 代碼,建議**整體遷移**而非打補丁。
原答主提供的百度知道鏈接:https://zhidao.baidu.com/question/59246284.html(內容一致:不支援跨過程 GoTo)。
總結:放棄 GoTo 幻想,擁抱結構化編程。任何「跳進函數中間」的需求,都能用「拆分函數、委託組合、狀態機」優雅解決。