Caso GoBo istruzione switch VB.NET
-
03-07-2019 - |
Domanda
Sto scrivendo del codice in VB.NET che utilizza un'istruzione switch ma in uno dei casi deve passare a un altro blocco. In C # sarebbe simile a questo:
switch (parameter)
{
case "userID":
// does something here.
case "packageID":
// does something here.
case "mvrType":
if (otherFactor)
{
// does something here.
}
else
{
goto default;
}
default:
// does some processing...
break;
}
Tuttavia, non so come convertirlo in VB.NET. Ho provato questo:
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo Case Else
End If
Case Else
' does some processing...
Exit Select
End Select
Ma quando lo faccio ottengo un errore del compilatore: " Identificatore previsto " ;. C'è una linea ondulata sotto "Caso". Qualche idea?
Inoltre, è sbagliato usare un'istruzione GoTo in questo caso? Sembra in qualsiasi altro modo che dovrei riscriverlo.
Ho modificato il mio codice come segue:
If otherFactor AndAlso parameter = "mvrType" Then
'does something here
Else
' My original "Select Case statement" here without the case for "mvrType"
End If
Soluzione
Non esiste un equivalente in VB.NET che ho trovato. Per questo pezzo di codice probabilmente vorrai aprirlo in Reflector e cambiare il tipo di output in VB per ottenere la copia esatta del codice che ti serve. Ad esempio, quando inserisco quanto segue in Reflector:
switch (args[0])
{
case "UserID":
Console.Write("UserID");
break;
case "PackageID":
Console.Write("PackageID");
break;
case "MVRType":
if (args[1] == "None")
Console.Write("None");
else
goto default;
break;
default:
Console.Write("Default");
break;
}
mi ha dato il seguente output VB.NET.
Dim CS$4<*> As String = args(0)
If (Not CS$4<*> Is Nothing) Then
If (CS$4<*> = "UserID") Then
Console.Write("UserID")
Return
End If
If (CS$4<*> = "PackageID") Then
Console.Write("PackageID")
Return
End If
If ((CS$4<*> = "MVRType") AndAlso (args(1) = "None")) Then
Console.Write("None")
Return
End If
End If
Console.Write("Default")
Come puoi vedere, puoi realizzare la stessa istruzione case switch con le istruzioni If. Di solito non lo consiglio perché rende più difficile la comprensione, ma VB.NET non sembra supportare la stessa funzionalità e l'utilizzo di Reflector potrebbe essere il modo migliore per ottenere il codice necessario per farlo funzionare senza molto dolore.
Aggiornamento:
Ho appena confermato che non puoi fare esattamente la stessa cosa in VB.NET, ma supporta alcune altre cose utili. Sembra che la conversione dell'istruzione IF sia la soluzione migliore o forse un refactoring. Ecco la definizione di Select ... Case
Altri suggerimenti
Perché non farlo in questo modo:
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
' do processing originally part of GoTo here
Exit Select
End If
End Select
Non sono sicuro che non avere un altro caso alla fine sia un grosso problema o no, ma sembra che tu non abbia davvero bisogno di andare se lo metti semplicemente nell'istruzione else del tuo if.
Perché non rifatti semplicemente il caso predefinito come metodo e lo chiami da entrambi i punti? Questo dovrebbe essere più leggibile e ti permetterà di modificare il codice in un secondo momento in modo più efficiente.
Non sono sicuro che sia una buona idea usare un GoTo ma se vuoi usarlo, puoi fare qualcosa del genere:
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo caseElse
End If
Case Else
caseElse:
' does some processing...
End Select
Come ho detto, sebbene funzioni, GoTo non è una buona pratica, quindi ecco alcune soluzioni alternative:
Uso di elseif ...
If parameter = "userID" Then
' does something here.
ElseIf parameter = "packageID" Then
' does something here.
ElseIf parameter = "mvrType" AndAlso otherFactor Then
' does something here.
Else
'does some processing...
End If
Utilizzo di un valore booleano ...
Dim doSomething As Boolean
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
doSomething = True
End If
Case Else
doSomething = True
End Select
If doSomething Then
' does some processing...
End If
Invece di impostare una variabile booleana, puoi anche chiamare un metodo direttamente in entrambi i casi ...
In VB.NET, è possibile applicare più condizioni anche se le altre condizioni non si applicano al parametro Select. Vedi sotto:
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType" And otherFactor
' does something here.
Case Else
' does some processing...
End Select
dovresti prima dichiarare l'etichetta usa questo:
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
Else
GoTo else
End If
Case Else
else :
' does some processing...
Exit Select
End Select
Select Case parameter
' does something here.
' does something here.
Case "userID", "packageID", "mvrType"
If otherFactor Then
' does something here.
Else
goto case default
End If
Case Else
' does some processing...
Exit Select
End Select
Select Case parameter
' does something here.
' does something here.
Case "userID", "packageID", "mvrType"
' does something here.
If otherFactor Then
Else
goto case default
End If
Case Else
' does some processing...
Exit Select
End Select
Select Case parameter
Case "userID"
' does something here.
Case "packageID"
' does something here.
Case "mvrType"
If otherFactor Then
' does something here.
End If
Case Else
' does some processing...
Exit Select
End Select
C'è un motivo per andare al goto? Se non soddisfa il criterio if, semplicemente non eseguirà la funzione e passerà al caso successivo.